Kivy: ScreenManager - Доступ к дочерним свойствам - PullRequest
0 голосов
/ 07 июля 2019

Я создаю приложение, и мне нужно, чтобы оно многократно отсчитывалось до нуля, пока не будет достигнут лимит времени.Это все работает нормально, но моя текущая проблема заключается в том, что, когда это заканчивается, я хочу, чтобы одна из меток сказала «Закончено», и, пытаясь использовать метод ids, я всегда получаю сообщение KeyError: 'count_down1', поскольку приложение вылетает прямо вконец при вызове функции finish_callback ().

Я новичок в kivy, но я предпочитаю, что self.ids [] ссылается на идентификатор, определенный в корневом виджете (т.е. WindowManager), но идентификатор: 'count_down1' находится в одном из дочерних виджетов WindowManager (т.е. SecondWindow).Тем не менее, даже если это правильно, я не смог разобраться, как это исправить, и не смог извлечь правильный ответ из других похожих вопросов.

py file

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.animation import Animation
from kivy.properties import NumericProperty
from random import randint


class MainWindow(Screen):
    pass

class SecondWindow(Screen):
    pass


class WindowManager(ScreenManager):
    a = NumericProperty(0)
    b = NumericProperty(0)
    run_t = 5
    min = 3
    max = 7

    def reset(self):
        self.a = 0
        self.b = 0

    def start(self, *args):
        self.a = randint(self.min, self.max)
        self.anim = Animation(a = 0, duration = self.a)
        if self.run_t - self.b <= self.max:
            self.a = self.run_t - self.b
            print("a=", self.a, "b=", self.b)
            self.anim = Animation(a = 0, duration = self.a)
        else:
            print(self.run_t - self.b)
            self.anim.bind(on_complete = self.start)

        self.anim.start(self)

    def count_up(self):
        self.anim = Animation(b = self.run_t, duration = self.run_t)
        self.anim.bind(on_complete = self.finish_callback)
        self.anim.start(self)

    def finish_callback(self, animation, param):
        print('in finish_callback')
        end_1 = self.ids['count_down1']
        end_1.text = 'Finished'
        #^^this is where the error occurs^^


 kv = Builder.load_file("updown.kv")

class PageScrollerApp(App):
    def build(self):
        return kv

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

kv file

WindowManager:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: "home"

    FloatLayout:        
        Button:
            pos_hint: {"x":0.4, "y":0.05}
            text: "Go!"
            on_release:
                root.manager.reset()
                root.manager.start()
                root.manager.count_up()
                root.manager.current = 'low'

<SecondWindow>:
    name: 'low'

    FloatLayout:        
        Label:            
            id: count_down1
            text: str(round(root.manager.a, 1))
            pos_hint: {"x": 0.4, "y": 0.55}
        Label:           
            id: count_up1
            text: str(round(root.manager.b, 1))
            pos_hint: {"x": 0.4, "y": 0.3}
        Button:
            background_color: 0.5,0.1,1,1
            text: 'Cancel'
            pos_hint: {"x":0.4, "y":0.05}
            on_release:
                root.manager.current = "medium"

<TextInput>
    size_hint: 0.24,0.1
    font_size: 35

<Button>
    font_size: 20
    color:1,0.2,0.5,1
    size_hint: 0.2, 0.1
    background_color: 0.5,0.8,0.2,1

<Label>
    font_size: 20
    color:1,0.2,0.5,1
    size_hint: 0.2, 0.1
    background_color: 0.5,0.2,0.9,1

Я попытался удалить весь ненужный код для удобства чтения.Таким образом, я думаю, что мой вопрос заключается в том, как получить доступ и изменить свойства дочернего виджета?Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 07 июля 2019

Проблема - KeyError

получить сообщение об ошибке KeyError: count_down1, так как приложение вылетает прямо в конец при вызове функции finish_callback ().

Основная причина

id: count_down1 не определено в ScreenManager. Он определен в SecondWindow(), но ScreenManager не имеет к нему доступа.

Kv language »Справочные виджеты

Область действия id ограничена правилом, в котором она объявлена, поэтому в вашем приложении count_down1 недоступен вне правила <SecondWindow>.

Решение

  1. Добавить id: second_window к созданному объекту, SecondWindow:, чтобы вы могли ссылаться на любые идентификаторы, объявленные в SecondWindow
  2. Заменить self.ids[ count_down1 ] на self.ids.second_window.ids.count_down1

Фрагменты - файл kv

WindowManager:
    MainWindow:
    SecondWindow:
        id: second_window

Snippets - py file

def finish_callback(self, animation, param):
    print('in finish_callback')
    self.ids.second_window.ids.count_down1.text = 'Finished'
...