kivy组件:多个按钮、居中、获取窗口/屏幕尺寸

0 投票
1 回答
1691 浏览
提问于 2025-04-18 18:00

我构建的这个应用程序总共有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 个回答

0

你的 start 组件在你设置其他组件的中心属性时,默认大小是 100, 100。这其实是正常的情况,即使它被添加到一个布局中(但这个布局的效果要等到你的函数完成后才会生效)。在这种情况下,实际上这并不重要,因为 start 还没有设置大小,也没有被添加到任何地方,所以它的大小自然不会有其他的变化。

一般来说,在使用 kivy 时,你应该换个方式来处理——不要试图只设置一次像大小这样的属性,而是要将它与另一个组件的属性 绑定,这样它就会自动更新。例如,你可以这样做:start.bind(center=startbtn.setter('center')),这是一种技巧,可以让一个函数设置 startbtn 的中心位置——每当 start 的中心位置改变时,这个函数就会被调用。

不过在这里,这种做法有点过于复杂了。你更应该使用一个布局类,比如说 anchorlayout,作为最顶层的组件。这样可以自动帮你完成所有的工作,自动将它的子组件居中。你可以把其他三个按钮放在另一个布局中,这样它们就可以相对定位了。

使用 kv 语言也能让这个过程变得更简单,因为它可以通过简单的属性引用自动创建绑定。

撰写回答