首页 文章

如何在kivy中获得小部件位置

提问于
浏览
0

我正在学习用Python和Kivy编写代码 . 我想得到一个按钮(button1)的位置,它位于一个boxlayout中,相对于窗口 . 但是当我打印 button1.posbutton1.to_window(*button1.pos) 时,我得到 [0, 0] ,这显然不是按钮的位置 . 我假设在我获得位置时按钮位置尚未更改,但我不确定从哪里可以放置此代码,以便在按钮位置更改后执行(可能是布局),如果这是问题所在 .

正如你在我的代码中看到的那样,我试图从 on_start 方法获得位置,希望这可以解决我的问题,但我得到了相同的结果 .

这是我的代码:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class Example(App):
    def build(self):
        return root

    def on_start(self):
        print("Position: " + str(button1.pos))
        print("Position2: " + str(button1.to_window(*button1.pos)))

root = BoxLayout()
root.orientation = 'vertical'
button1 = Button(text = "Button1")
button2 = Button(text = "Button2")
root.add_widget(button1)
root.add_widget(button2)

Example().run()

谢谢

1 回答

  • 0

    要了解问题,您应该查看the docs

    on_start()on_start事件的事件处理程序,它在初始化之后(在调用build()之后但在应用程序开始运行之前触发) .

    如前所述 start() 在启动应用程序之前被调用,因此 BoxLayout 仍然无法正常工作,因此您将获得每个小部件的默认位置 (0, 0) . 对于这些情况,您必须使用 Clock.schedule_once() ,它在完成执行同步任务并渲染下一帧时调用该函数 .

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.button import Button
    from kivy.clock import Clock
    
    class Example(App):
        def build(self):
            Clock.schedule_once(lambda *args: self.print_pos())
            return root
    
        def print_pos(self):
            print("Position: " + str(button1.pos))
            print("Position2: " + str(button1.to_window(*button1.pos)))
    
    root = BoxLayout()
    root.orientation = 'vertical'
    button1 = Button(text = "Button1")
    button2 = Button(text = "Button2")
    root.add_widget(button1)
    root.add_widget(button2)
    
    Example().run()
    

    在我的情况下,我得到以下内容:

    Position: [0, 300.0]
    Position2: (0, 300.0)
    

    这是有效的,因为kivy的位置是左下角 .

相关问题