Vous pouvez utiliser threading
pour ça.
Lorsque vous effectuez une boucle ou attendez une entrée dans kivy, le thread principal attend et rien ne se mettra à jour sur l'application. threading
empêchera cela.
Utilisez threading
pour créer un autre fil en plus du fil principal.
Exemple :
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.lang import Builder
import threading
Builder.load_string('''
<MyBox>:
orientation: 'horizontal'
cols: 2
Label:
text: root.tobeupd
Button:
text: 'Start Update'
on_release: root.upd_ltxt()
''')
class MyBox(BoxLayout):
tobeupd = StringProperty()
def __init__(self,*args,**kwargs):
super(MyBox,self).__init__(*args,**kwargs)
self.tobeupd = '#'
def upd_ltxt(self):
threading.Thread(target=self.update_label).start()
def update_label(self):
for i in range(1,10):
print(self.tobeupd)
self.tobeupd = str(i)
input('Write something: ') # new line, see edit below
class updApp(App):
def build(self):
return MyBox()
if __name__ == '__main__':
updApp().run()
Maintenant, il convient de mentionner que vous pouvez continuer à appuyer sur le bouton et démarrer des discussions, même si la première n'est pas encore terminée. Cela pourrait être un comportement indésirable.
Cela peut être évité en désactivant le bouton au début du fil et en le réactivant à la fin.
Donnez au bouton un identifiant en kv :
Button:
id: updatebutton
text: 'Start Update'
on_release: root.upd_ltxt()
Et dans le fil faites comme ceci :
def update_label(self):
self.ids.updatebutton.disabled = True
for i in range(1,10):
self.tobeupd = str(i)
input('Write something: ')
self.ids.updatebutton.disabled = False