2016-12-30 2 views
1

Ich habe eine Frage bezüglich der Aktualisierung des Etikettentextes gestellt (Kivy change label text with python) - es wurde beantwortet und hat funktioniert, aber ich habe stundenlang versucht, meinen laufenden Code an ScreenManager anzupassen, damit ich mehrere Bildschirme haben kann. Ich habe den Code auf die grundlegenden Dinge reduziert, die ich nicht funktionieren kann.Kivy ScreenManager - Etikettentext aktualisieren

ScreenManager Code bricht die Lösung, ich weiß, was das Problem ist, ich kann es einfach nicht lösen. Der Code funktioniert, Text und Zeit aktualisiert in der Shell, aber nicht die Etiketten, konnte ich return self.first_screen nicht hinzufügen, um die Kivy def build so seine Bindung an the_time: _id_lbl_time - Jede Hilfe/Zeiger würde wirklich geschätzt werden.

from kivy.app import App 
from kivy.base import runTouchApp 
from kivy.lang import Builder 
from kivy.properties import ListProperty, StringProperty, ObjectProperty 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition, FadeTransition 
from kivy.uix.anchorlayout import AnchorLayout 
from kivy.clock import Clock 
import time 
from datetime import datetime, timedelta 


class FirstScreen(Screen): 
    def update_time(self, sec): 
    MyTime = time.strftime("%H:%M:%S") 
    print MyTime # to test update_time is called etc 
    self.the_time.text = MyTime #<---- self.the_time isn't working 

class SecondScreen(Screen): 
    def update_text(self, sec): 
    MyText = 'New Text' 
    print MyText # to test update_text is called etc 
    self.the_set.text = MyText #<---- self.the_set isn't working 

class MyScreenManager(ScreenManager): 
    pass 

Builder.load_string(''' 

<FirstScreen>: 
    name: 'first' 
    the_time: _id_lbl_time 

    BoxLayout: 
     orientation: 'vertical' 
     Label 
      id: _id_lbl_time 
      text: 'Clock' 
      font_size: 30 
     BoxLayout: 
      Button: 
       text: 'New Here' 
       font_size: 20 
       size: 200, 50 
       size_hint: None, None 
       on_release: app.root.current = 'second' 

<SecondScreen>: 
    name: 'second' 
    the_set: _id_lbl_set 

    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      id: _id_lbl_set 
      text: 'New Here' 
      font_size: 30 
     BoxLayout: 
      Button: 
       text: 'Main' 
       font_size: 20 
       size: 200, 50 
       size_hint: None, None 
       on_release: app.root.current = 'first' 
''') 
class ScreenManagerApp(App): 
    def build(self): 
     sm = ScreenManager() 
     sm.add_widget(FirstScreen(name='first')) 
     sm.add_widget(SecondScreen(name='second')) 
     self.first_screen = FirstScreen() 
     self.sec_screen = SecondScreen() 
     return sm #<---- I can't return self.first_screen etc here? 

    def on_start(self): 
     Clock.schedule_interval(self.first_screen.update_time, 1)    # 1 second 
     Clock.schedule_interval(self.sec_screen.update_text, 2) 

ScreenManagerApp().run() 

Antwort

0

Ich kann nicht mehr zurück self.first_screen etc hier?

Nein, es hat ein ScreenManager auf der Oberseite der Screen Widgets sein, sonst ist es nur ein RelativeLayout als seine Definition in dem Quellcode ist.

Sie haben einen wirklich häufigen Fehler von Anfängern erfahren. Sie verwendet eine Instanz FirstScreen() und SecondScreen() für ScreenManager (die sichtbar sind) und dann erstellt man eine andere Instanzen mit:

self.first_screen = FirstScreen() 
self.sec_screen = SecondScreen() 

die Sie dann für Clock verwendet:

Clock.schedule_interval(self.first_screen.update_time, 1) 
Clock.schedule_interval(self.sec_screen.update_text, 2) 

und das bedeutet text Eigenschaften in Instanzen dass tatsächlich nirgendwo hinzugefügt werden, da Widgets für die Aktualisierung verwendet wurden. Die Instanzen existieren, also ist kein Fehler auszulösen außer der visuellen → Sie sehen die Werte nicht, weil Sie eine falsche Instanz verwendet haben.

Correct build():

def build(self): 
    sm = ScreenManager() 
    self.first_screen = FirstScreen(name='first') 
    self.sec_screen = SecondScreen(name='second') 
    sm.add_widget(self.first_screen) 
    sm.add_widget(self.sec_screen) 
    return sm 
+0

Ja arbeitete - Worth Zugabe für zukünftige Forscher, dass 'Build (Selbst-):' muss 'Rückkehr sm' den Screen zurückzukehren tatsächlich, es zu zeigen. – northwarks

+0

Ja, danke. Bearbeitet ^^ – KeyWeeUsr