我正在学习使用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()
谢谢
答案 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)
这是有效的,因为在猕猴桃中的位置相对于左下角。