[英]Float Layout adding custom sized widgets with Kivy
我是python和kivy的新手,我試圖通過制作一個小部件來學習:
Main.py文件:
class start(App):
def build(self):
return Holder()
if __name__ == '__main__':
start().run()
碼:
class Holder(FloatLayout):
def __init__(self, **kwargs):
self.size=(300,300)
super(Holder,self).__init__(**kwargs)
c=Cell()
c.pos=(100,100)
self.add_widget(c)
print(str(c.pos))
d=Cell()
d.pos=(100,0)
self.add_widget(d)
print(str(d.pos))
class Cell(Widget):
def __init__(self, **kwargs):
super(Cell,self).__init__(**kwargs)
with self.canvas:
Color(1, 0, 0)
Rectangle(size=(50, 50))
self.height=50
self.width=50
問題是,雖然我要添加2個具有不同pos的單元格,但仍然使它們重疊,並且它們都僅顯示在角落。
你能告訴我我哪里出了問題。
編輯:我已更新單元格的代碼,如下所示:
class Cell(Widget):
rect=Rectangle(size=(50, 50))
def __init__(self, **kwargs):
super(Cell,self).__init__(**kwargs)
self.canvas.add(Color(1, 0, 0))
self.canvas.add(self.rect)
self.bind(pos=self.callback_pos)
def callback_pos(self, value):
self.rect.pos=self.pos
但是,現在我收到錯誤,因為“ TypeError:callback_pos()接受2個位置參數,但給出了3個”
您的繪圖代碼是
with self.canvas:
Color(1, 0, 0)
Rectangle(size=(50, 50))
...這就是您所看到的,這兩個矩形的大小分別為(50,50),並且默認位置為(0,0),因為您沒有設置該大小。
如果希望矩形以小部件的大小和形狀顯示,則必須自己綁定該矩形,即保留對矩形的引用,並使用小部件bind
方法調用一個只要小部件位置發生變化即可更新其位置的函數。 。
這有點冗長,這是我們建議使用kv語言的原因之一-它可以為您做到這一點!
<Cell>:
canvas:
Color:
rgb: 1, 0, 0
Rectangle:
pos: self.pos
size: 50, 50
每當它更改時,這將自動更新pos以匹配self.pos。
您完成了kivy pong教程嗎? 我建議這樣做。 您可能也對我的視頻教程感興趣。
編輯:回復您自己的編輯:
rect=Rectangle(size=(50, 50))
您應該將此行放在__init__
,因為它是一個類級別的變量,因此您可以將其傳遞給每個實例相同的矩形。 那實際上可能不會崩潰並在這里起作用,但這不是您的意思,因此可能是不好的做法。
但是,現在我收到錯誤,因為“ TypeError:callback_pos()接受2個位置參數,但給出了3個”
您有論點self, value
。 綁定(以及所有kivy屬性綁定)實際上使用self, instance, value
調用。 只需添加此額外的參數(或使用*args
捕獲所有*args
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.