Kivy:在每次触摸之后(在触摸屏上)在FloatLayout中添加图像,但是所有以前的图像都消失了

2024-07-21 09:35:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在每次触发on_touch_down方法时绘制一个图像(Image对象)。每个图像都有相同的源。这是在FloatLayout内完成的,绘图是由self.add_widget(theImage)完成的。我没有错误,但每次触摸后只能显示一个图像(以前的图像在每次触摸后消失)。你知道吗

但是如果我在on_touch_down中写print(self.children),我们可以看到列表在每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()

Tags: from图像imageimportselfappploton
1条回答
网友
1楼 · 发布于 2024-07-21 09:35:12

根据观察到的情况,如果在创建小部件时没有建立pos\u提示,则它具有空字典的值,该字典是类的属性,而不是对象的属性,这意味着如果建立了一个值,则会为其他对象建立一个对象。你知道吗

为了验证这一点,打印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)

相关问题 更多 >