Я создаю приложение, и мне нужно, чтобы оно многократно отсчитывалось до нуля, пока не будет достигнут лимит времени.Это все работает нормально, но моя текущая проблема заключается в том, что, когда это заканчивается, я хочу, чтобы одна из меток сказала «Закончено», и, пытаясь использовать метод 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
Я попытался удалить весь ненужный код для удобства чтения.Таким образом, я думаю, что мой вопрос заключается в том, как получить доступ и изменить свойства дочернего виджета?Любая помощь будет принята с благодарностью!