update label.text w kivy

0

Witam,

Mam następujący problem z aplikacją w kivy. Mam label i button. Tekst ładuje się do Label z pickle. Po wciśnięciu button wyzwalają się 2 funkcję. Pierwsza to aktualizacja pliku pickle. Kolejna powinna zaktualizować tekst Label. Ta druga nie działa. Zawartość pickle się zmienia ale do Label załaduje się dopiero po ponownym uruchomieniu programu. Będę wdzięczny za każda pomoc. Podaje tylko przykładowy uproszczony kod.

.py


from kivy.app import App
import pickle
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen
rom kivy.properties import ObjectProperty
import random



class MainScreen(Screen):

    with open("a.pickle", 'rb') as f:
        a = pickle.load(f)

    text = "%s" % a

    def update_pickle(self):
        
        with open("a.pickle", 'rb') as f:
        a = pickle.load(f)
    
        a.clear()

        lista = ["a", "b", "c", "d"]

        a[str(random.choice(lista))] = '0'
      
        with open("a.pickle", "wb") as f:
            pickle.dump(a, f)
   
    def update_label(self):
        
        with open("a.pickle", 'rb') as f:
                a = pickle.load(f)

        text = "%s" % a
        
        return text

sm = ScreenManager()
sm.add_widget(MainScreen(name='Main'))

class App(App):

    def build(self):
        return sm


if __name__ == '__main__':
    App().run()


.kv


<MainScreen>
    Button:
        text_size: self.size
        pos_hint: {'x': .67, 'y': .80}
        size_hint: .25, .03
        background_color:2, 2, 2
        text: 'Update label'
        on_press:
            root.update_pickle()
            root.update_label()

    Label:
        Label: #a
        text_size: self.size
        pos_hint: {'x': .05, 'y': .60}
        size_hint: .80, .20
        background_color:2, 2, 2
        text: root.text
        

0

Jeśli chodzi o tą funkcję, to Spróbuj tak:

def update_label(self):

        with open("a.pickle", 'rb') as f:
                a = pickle.load(f)
                text = "%s" % a

        return text
0
from kivy.app import App
import pickle
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen
rom kivy.properties import ObjectProperty
import random
from kivy.propreties import StringProperty

class MainScreen(Screen):


    text = StringProperty()

    def update_pickle(self):

        with open("a.pickle", 'rb') as f:
        a = pickle.load(f)

        a.clear()

        lista = ["a", "b", "c", "d"]

        a[str(random.choice(lista))] = '0'

        with open("a.pickle", "wb") as f:
            pickle.dump(a, f)

    def update_label(self):

        with open("a.pickle", 'rb') as f:
                a = pickle.load(f)

        self.text = "%s" % a

        

sm = ScreenManager()
sm.add_widget(MainScreen(name='Main'))

class App(App):

    def build(self):
        return sm

if __name__ == '__main__':
    App().run()

Teraz za każdym razem, po naciśnięciu buttona text label się zmienia. Problem pojawił się inny. W momęcie załadowania screena nie ma żadnego tekstu. Czy wie ktoś jak wywołać funkcję update_label() w trakcie uruchamiania urogramu?

0

Tak gdyby ktoś był zainteresowany:

Przegapiłem tą opcję za pierwszym razem podczas czytania dokumentacji.

<mainscreen> on_enter: root.update_label()

Teraz wszystko działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1