Python >> Tutoriel Python >  >> Python GUI >> Kivy GUI

Kivy :le texte de l'étiquette ne se met pas à jour pendant la boucle for

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