我是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
问题是,althogh我正在添加2个不同位置的单元格,我仍然让它们重叠,并且它们都只在角落显示。
你能不能让我知道我哪里出错了。
编辑: 我更新了Cell的代码如下:
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个被赋予”
答案 0 :(得分:1)
您的绘图代码是
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教程吗?我建议这样做。您可能也对我的video tutorials感兴趣。
编辑:回复您自己的编辑:
rect=Rectangle(size=(50, 50))
你应该把这一行放在__init__
中,你的方式会将同一个矩形传递给每个实例,因为它是一个类级变量。那个可能实际上并没有崩溃并在这里工作,但它不是你的意思,可能是因为这个原因的坏习惯。
然而,现在我收到错误&#34; TypeError:callback_pos()需要2个位置参数但是3个被给出&#34;
您有参数self, value
。绑定(以及所有kivy属性绑定)实际上使用self, instance, value
调用。只需添加这个额外的参数(或用*args
抓住它们。)