kivy组件:多个按钮、居中、获取窗口/屏幕尺寸
我构建的这个应用程序总共有4个小部件,其中1个是主小部件,里面放了3个按钮小部件。我想把这些按钮放在主小部件/屏幕的中间,但主小部件的宽度和高度似乎只有100x100,尽管屏幕要大得多。所以当我尝试把按钮居中到屏幕上时,它们仍然停留在左下角。我可以通过手动设置坐标来调整每个按钮的中心位置,但一旦我调整窗口大小,按钮就不会再居中了。有没有什么办法可以获取当前屏幕的大小和宽度,这样按钮无论窗口大小如何变化,都能保持在正确的位置?这是我目前的代码:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
class MyApp(App):
def build(self):
start=Widget()
startbtn=Button(text="Start")
optionsbtn=Button(text="Options")
exitbtn=Button(text="Exit")
start.add_widget(startbtn)
start.add_widget(optionsbtn)
start.add_widget(exitbtn)
startbtn.center=(start.width,start.height)
optionsbtn.center_x+=200
optionsbtn.center_y+=100
exitbtn.center=start.center
return start
if __name__=="__main__":
MyApp().run()
如果你测试一下,你会发现退出按钮并没有居中,而是静静地待在左下角。
1 个回答
你的 start
组件在你设置其他组件的中心属性时,默认大小是 100, 100
。这其实是正常的情况,即使它被添加到一个布局中(但这个布局的效果要等到你的函数完成后才会生效)。在这种情况下,实际上这并不重要,因为 start
还没有设置大小,也没有被添加到任何地方,所以它的大小自然不会有其他的变化。
一般来说,在使用 kivy 时,你应该换个方式来处理——不要试图只设置一次像大小这样的属性,而是要将它与另一个组件的属性 绑定,这样它就会自动更新。例如,你可以这样做:start.bind(center=startbtn.setter('center'))
,这是一种技巧,可以让一个函数设置 startbtn
的中心位置——每当 start
的中心位置改变时,这个函数就会被调用。
不过在这里,这种做法有点过于复杂了。你更应该使用一个布局类,比如说 anchorlayout
,作为最顶层的组件。这样可以自动帮你完成所有的工作,自动将它的子组件居中。你可以把其他三个按钮放在另一个布局中,这样它们就可以相对定位了。
使用 kv 语言也能让这个过程变得更简单,因为它可以通过简单的属性引用自动创建绑定。