每次尝试触发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()
答案 0 :(得分:1)
根据创建小部件时未建立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)