Обновление свойств виджета kivy во время работы кода

Я хочу обновить свойства виджета kivy во время чего-то …

Пример:

class app(App): def build(self): self.layout = Layout() self.name = Label(text = "john") self.layout.add_widget(self.name) return self.layout def update(self): for i in range(50): #keep showing the update self.name.text = str(i) #maybe some sleep here obj = app() obj.run() obj.update() 

Это покажет мне только окончательный результат цикла. Я хочу продолжать обновлять label.text, пока идет цикл.

Я искал что-то вроде функций bind (), setter () и ask_update (), но если эти функции, я не понял, как их использовать.

—————— РЕДАКТИРОВАТЬ ———————–

Пытаясь адаптироваться к inclement ответу (запуск функции обновления в другом потоке с помощью Clock), я получил код ниже, пытаясь понять реальную идею моей проблемы, но все еще не работает:

 class main(): def __init__(self, app): self.app = app ... some code goes here ... def func(self): Clock.schedule_once(partial(self.app.update, self.arg_1, self.arg_2), 0) class app(App): def build(self): self.main = main(self) self.layout = Layout() self.name = Label(text = "john") self.layout.add_widget(self.name) return self.layout ... some code goes here ... def update(self, dt, arg_1, arg_2): self.name = arg_1 sleep(5) self.name = arg_2 obj = app() obj.run() 

Мне нужно вызвать func и обновить текст метки, когда я закажу изменение текста в функции update .

2 Solutions collect form web for “Обновление свойств виджета kivy во время работы кода”

Вам нужно избегать блокировки основного потока. В большинстве случаев удобно использовать часы kivy. Вы можете сделать что-то вроде следующего.

 from kivy.clock import Clock class app(App): def build(self): self.layout = Layout() self.name = Label(text = "john") self.layout.add_widget(self.name) self.current_i = 0 Clock.schedule_interval(self.update, 1) return self.layout def update(self, *args): self.name.text = str(self.current_i) self.current_i += 1 if self.current_i >= 50: Clock.unschedule(self.update) 

Не уверен, что кому-то все еще нужен ответ, но кажется, что ваша ошибка здесь:

 def update(self, dt, arg_1, arg_2): self.name = arg_1 sleep(5) self.name = arg_2 

Вы либо назначаете arg1 либо arg2 , предположительно, строкам, чтобы виджет, который, похоже, не имеет большого смысла. Или создать новый виджет и переназначить его на одну и ту же переменную, что также неверно. Вместо этого вы можете напрямую передать свойство:

 def update(self, dt, arg_1, arg_2): self.name.text = arg_1 sleep(5) self.name.text = arg_2 

Или вы можете создать StringProperty на своем основном объекте и связать с ним self.name.text , но я лично предпочитаю обновлять экран вручную. Явное лучше, чем неявное и все такое.

Python - лучший язык программирования в мире.