Как обновлять NumericProperty каждую секунду? - PullRequest
1 голос
/ 22 октября 2019

У меня есть три NumericProperteis, которые я хочу обновлять каждую секунду. Я пытался использовать Clock.schedule_interval (), потому что это похоже на то, что я хочу. Как я могу обновить NumericProperteis? Могу ли я использовать другое событие, которое запускается в Kivy MainLoop? Или, может быть, я не изменяю NumericProperty правильно?

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


Builder.load_string("""
<MyLabel>
    text: "{}: {}".format(self.title, self.value)

<UpdatingLabels>
    GridLayout:
        rows: 1
        pos: 0, 0
        size: root.size
        MyLabel:
            id: lb0
            title: "value 0"
        MyLabel:
            id: lb1
            title: "value 1"
        MyLabel:
            id: lb2
            title: "value 2"
""")


class UpdatingLabels(Widget):
    pass


class MyLabel(Label):
    value = NumericProperty(0)
    title = StringProperty('')

# This not working but the same what i wanna do
# In real case i have values genereted every second
# def clock_def(dt):
#     MyLabel.ids.lb0.value += 1 # or MyLabel.ids.lb0.value = genereted_value_1
#     MyLabel.ids.lb1.value += 2
#     MyLabel.ids.lb2.value += 3

# event = Clock.schedule_interval(clock_def, 1)


class MyApp(App):
    def build(self):

        return UpdatingLabels()


if __name__ == '__main__':
    MyApp().run()

Ответы [ 2 ]

1 голос
/ 22 октября 2019

«Идентификаторы» - это атрибуты экземпляра, а не класса, поэтому, если вы хотите получить к ним доступ, используйте созданный объект или себя в классе. Таким образом, вы не можете получить доступ к идентификаторам с помощью MyLabel.

Решение состоит в том, чтобы реализовать логику в классе UpdatingLabels.

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


Builder.load_string(
    """
<MyLabel>
    text: "{}: {}".format(self.title, self.value)

<UpdatingLabels>
    GridLayout:
        rows: 1
        pos: 0, 0
        size: root.size
        MyLabel:
            id: lb0
            title: "value 0"
        MyLabel:
            id: lb1
            title: "value 1"
        MyLabel:
            id: lb2
            title: "value 2"
"""
)


class UpdatingLabels(Widget):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        event = Clock.schedule_interval(self.clock_def, 1)

    def clock_def(self, dt):
        self.ids.lb0.value += 1
        self.ids.lb1.value += 2
        self.ids.lb2.value += 3


class MyLabel(Label):
    value = NumericProperty(0)
    title = StringProperty("")


class MyApp(App):
    def build(self):
        return UpdatingLabels()


if __name__ == "__main__":
    MyApp().run()
0 голосов
/ 23 октября 2019

Решение от Eyllanesc верное, но оно, конечно, не единственное, альтернативное, если вы хотите сохранить логику в приложении, поэтому используйте идентификаторы из корневого виджета.

Поскольку вашкорневым классом является UpdatingLabels, и вы хотите обновить виджеты внутри того, у которого есть идентификатор, вы можете получить к ним доступ через app.root, который всегда ссылается на виджет, который был возвращен методом сборки.

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


Builder.load_string("""
<MyLabel>
    text: "{}: {}".format(self.title, self.value)

<UpdatingLabels>
    GridLayout:
        rows: 1
        pos: 0, 0
        size: root.size
        MyLabel:
            id: lb0
            title: "value 0"
        MyLabel:
            id: lb1
            title: "value 1"
        MyLabel:
            id: lb2
            title: "value 2"
""")


class UpdatingLabels(Widget):
    pass


class MyLabel(Label):
    value = NumericProperty(0)
    title = StringProperty('')




class MyApp(App):
    def build(self):
        Clock.schedule_interval(self.clock_def, 1)
        return UpdatingLabels()

    def clock_def(self, dt):
        self.root.ids.lb0.value += 1
        self.root.ids.lb1.value += 2
        self.root.ids.lb2.value += 3

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