update label.text w kivy

Odpowiedz Nowy wątek
2019-06-07 00:12
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

Pozostało 580 znaków

2019-06-07 00:36
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

Nic to nie dało. - Glt87 2019-06-07 07:41

Pozostało 580 znaków

2019-06-08 10:08
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?

Pozostało 580 znaków

2019-06-08 21:53
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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