python - Kivy:每次触摸后在 FloatLayout 中添加图像(on_touch_down),但之前的所有图像都消失了
问题描述
Image
每次on_touch_down
触发该方法时,我都试图绘制一个图像(对象)。每个图像都有相同的来源。这是在 内部完成的FloatLayout
,并且绘图是由 完成的self.add_widget(theImage)
。我没有错误,但每次触摸后只能显示一个图像(以前的图像在每次触摸后消失)。
但是如果我print(self.children)
在里面写on_touch_down
,我们可以看到列表在每个touch
.
为什么是这样?谢谢。
(*图像大小为屏幕可以容纳20张图像而不会相互碰撞)
编码 :
from kivy.app import App
from kivy.uix.image import Image
from kivy.uix.floatlayout import FloatLayout
import random
class Screen(FloatLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def on_touch_down(self, touch):
super().on_touch_down(touch)
plot = Image(source='bottle.jpg')
plot.pos_hint['x'] = random.uniform(0,1) - 0.5*plot.size_hint_x
plot.pos_hint['y'] = random.uniform(0,1) - 0.5*plot.size_hint_y
self.add_widget(plot)
class MyApp(App):
def build(self):
return Screen()
app = MyApp()
if __name__ == '__main__':
app.run()
解决方案
根据在创建小部件时未建立 pos_hint 时观察到的情况,它具有空字典的值,该字典是类的属性而不是对象的属性,这意味着如果建立了值,则建立对象其他对象。
为了验证这一点,打印 pos_hint 的 id 以获得相同的值:
def on_touch_down(self, touch):
super().on_touch_down(touch)
plot = Image(source='bottle.jpg')
plot.pos_hint['x'] = random.uniform(0,1) - 0.5*plot.size_hint_x
plot.pos_hint['y'] = random.uniform(0,1) - 0.5*plot.size_hint_y
print(id(plot.pos_hint))
self.add_widget(plot)
输出:
140252781257784
140252781257784
140252781257784
140252781257784
...
所以解决方案是传递一个新字典:
def on_touch_down(self, touch):
super().on_touch_down(touch)
plot = Image(source='bottle.jpg', pos_hint={'x':.0, 'y':.0}) # <-- default value
plot.pos_hint['x'] = random.uniform(0,1) - 0.5*plot.size_hint_x
plot.pos_hint['y'] = random.uniform(0,1) - 0.5*plot.size_hint_y
self.add_widget(plot)
或者直接传递新字典:
def on_touch_down(self, touch):
super().on_touch_down(touch)
plot = Image(source='bottle.jpg')
plot.pos_hint = {'x': random.uniform(0,1) - 0.5*plot.size_hint_x, 'y': random.uniform(0,1) - 0.5*plot.size_hint_y}
self.add_widget(plot)
推荐阅读
- javascript - 我的机器人无法使用系统分配的托管标识访问 Blob 存储帐户
- swift - 如何修复segue显示灰屏
- jenkins - 如何在 Jenkins Jobs 中运行代码审查工作流程以编写脚本?
- mysql - 在mysql上加入两个不同的Selects创建的两个表
- html - 多个 Eventemitter 发出 html 中调用的同步函数
- php - 使用我的模型调用未定义方法的 codeigniter 错误
- react-native - React Native AsyncStorage 不起作用 - 现在我做错了什么?
- ruby-on-rails - 如何为另一个模型中的模型设置变量?
- sql - 用于更新和插入的 Hive 托管与外部表
- java - 是否可以访问 Android 应用程序的 Indeed API?