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

时间:2018-12-10 03:14:22

标签: python kivy

我正在学习使用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 :(得分: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)

这是有效的,因为在猕猴桃中的位置相对于左下角。