簡體   English   中英

Kivy:每次觸摸后(on_touch_down)在FloatLayout中添加圖像,但以前的所有圖像都消失了

[英]Kivy : adding Images in FloatLayout after each touch (on_touch_down), but all previous images disappeared

我每次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()

根據觀察到的結果,如果在創建窗口小部件時未建立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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM