Как получить позицию виджета в киве - PullRequest
0 голосов
/ 10 декабря 2018

Я учусь программировать на 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 Ответ

0 голосов
/ 10 декабря 2018

Чтобы понять проблему, вы должны просмотреть документы :

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)

И это действительно так, поскольку позиция в киви относительно левого нижнего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...