Обновите многократно используемый виджет Label в Kivy с помощью Clock.Interval - PullRequest
1 голос
/ 26 января 2020

Я разрабатываю многостраничное приложение Kivy, для которого я хочу иметь виджет часов на нескольких страницах. Мне удалось реализовать его на каждой странице в качестве отдельного экземпляра, но я хотел изменить его на многократно используемый виджет, но он не обновляется в течение интервалов

Это реализация файла .kv

ScreenManager:
id: screen_manager
HomeScreen:
    id: home_screen
    name: 'home_screen'
    manager: 'screen_manager'

<ClockWidget>:
    Label:
        text_size: self.size
        halign: 'left'
        valign: 'middle'
        id: clocktime
        text: root.ClockTimeDisplay

<HomeScreen>:
    orientation: 'vertical'
    ScrollView:
        do_scroll_x: True
        scroll_distance: 20
        BoxLayout:
            orientation: 'vertical'
            ClockWidget:

вот файл .py. В рамках функции update_clock я попробовал все 3 из этих реализаций одновременно. Он печатает время должным образом, но не обновляет метку, продолжает говорить «фиктивный текст».

class ClockWidget(Label):
    ClockTimeDisplay = StringProperty()
    ClockTimeDisplay = "dummy text"
    text = ClockTimeDisplay

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

    def update_clock(self, *args):
        print(self.text)
        #I've tried all 3 of these implimentations at one time or another.
        self.ClockTimeDisplay = str(datetime.now().strftime('%H:%M:%S'))
        self.text = str(datetime.now().strftime('%H:%M:%S'))
        self.ids.clocktime.text = str(datetime.now().strftime('%H:%M:%S'))

        return ClockTimeDisplay


class HomeScreen(Screen):
    pass


class regatta_racer(App):
    def build(self):
        clock_widget = ClockWidget()
        Clock.schedule_interval(clock_widget.update_clock, .1)
        return Builder.load_file('regatta_racer.kv')


if __name__ == "__main__":
    regatta_racer().run()

Я также пытался вызвать интервал внутри функции on_load внутри ClockWidget, но это не сработало либо.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 26 января 2020

Проблема в том, что ClockWidget, созданный в методе сборки, отличается от ClockWidget, созданного как дочерний элемент BoxLayout в .kv, в вашем случае только Clock вызывает только метод update_clock первого.

С другой стороны, я не вижу необходимости создавать новый StringProperty в ClockWidget, поскольку он является меткой и имеет свойство «текст», и еще одна странная вещь заключается в том, что метка имеет другую метку в качестве дочерней.

Учитывая вышеизложенное, решение выглядит так:

from datetime import datetime

from kivy.app import App

from kivy.clock import Clock
from kivy.lang import Builder

from kivy.uix.screenmanager import Screen
from kivy.uix.label import Label


class ClockWidget(Label):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        Clock.schedule_interval(self.update_clock, 0.1)

    def update_clock(self, *args):
        self.text = datetime.now().strftime("%H:%M:%S")


class HomeScreen(Screen):
    pass


class regatta_racer(App):
    def build(self):
        return Builder.load_file("regatta_racer.kv")


if __name__ == "__main__":
    regatta_racer().run()
ScreenManager:
    id: screen_manager
    HomeScreen:
        id: home_screen
        name: 'home_screen'
        manager: 'screen_manager'

<ClockWidget>:
    text_size: self.size
    halign: 'left'
    valign: 'middle'

<HomeScreen>:
    orientation: 'vertical'
    ScrollView:
        do_scroll_x: True
        scroll_distance: 20
        BoxLayout:
            orientation: 'vertical'
            ClockWidget:
...