【问题标题】:How to get widget position in kivy如何在kivy中获取小部件位置
【发布时间】:2018-12-10 11:29:14
【问题描述】:

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

谢谢

【问题讨论】:

标签: python kivy


【解决方案1】:

要了解问题,您应该查看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 中的位置是相对于左下角的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多