我正在学习用Python和Kivy编写代码 . 我想得到一个按钮(button1)的位置,它位于一个boxlayout中,相对于窗口 . 但是当我打印 button1.pos
或 button1.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 回答
要了解问题,您应该查看the docs:
如前所述
start()
在启动应用程序之前被调用,因此BoxLayout
仍然无法正常工作,因此您将获得每个小部件的默认位置(0, 0)
. 对于这些情况,您必须使用Clock.schedule_once()
,它在完成执行同步任务并渲染下一帧时调用该函数 .在我的情况下,我得到以下内容:
这是有效的,因为kivy的位置是左下角 .