Ярлык киви texture_size равен 0,0 после изменения текста - PullRequest
0 голосов
/ 03 мая 2020

У меня есть метка в моем .kv файле:

Label:
    id: question
    font_size: 40
    center_x: root.center_x
    center_y: root.center_y

В моем классе виджетов root есть следующее:

class MainScreen(Widget):
    question = ObjectProperty(None)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.set_question()

    def set_question(self):
        self.question.text = "placeholder"
        print(self.question.texture_size)

    def on_question(self,instance, value):
        print(value.texture_size)

Это возвращает [0,0] дважды , У меня сложилось впечатление, что on_question сработает при изменении self.question.text, и что параметр value будет обновленной меткой и, следовательно, с правильным texture_size. Однако это не так, и кажется, что либо texture_size не обновляется, либо оператор print в on_question вызывается до установки texture_size.

Как получить доступ к texture_size после его установки?

1 Ответ

1 голос
/ 03 мая 2020

Это интересная проблема, так как документы рекомендуют явно связывать с texture_size, что у меня не работает. Кроме того, принудительно сделанный refre sh с texture_update () не сработал. Таким образом, единственный способ получить размер текстуры (как уже упоминалось в комментариях) - это событие Clock. Вот мой подход, может быть, он поможет вам с вашей проблемой.

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.lang.builder import Builder
from kivy.uix.label import Label
from kivy.clock import Clock


kv_string = """
<MainWidget>:
    question: question_id
    Label:
        id: question_id
        font_size: 40
        center_x: root.center_x
        center_y: root.center_y
"""

Builder.load_string(kv_string)


class MainWidget(Widget):
    question = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(MainWidget, self).__init__(**kwargs)
        self.question.bind(texture_size=self.on_question)
        self.set_question()


    def set_question(self):
        self.question.text = "placeholder"
        #print(self.question.texture_size)

    def on_question(self, instance, value):
        if isinstance(value, Label):
            Clock.schedule_once(self.get_texture_size, 0)

    def get_texture_size(self, dt):
            print(self.question.texture_size)


class MyApp(App):
    def build(self):
        main = MainWidget()
        return main


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