2016-12-30 137 views
1

我問了一個關於更新標籤文本的問題(Kivy change label text with python) - 它已經回覆並正在工作,但我一直試圖將我的運行代碼修改爲ScreenManager以便我可以有多個屏幕。我已經將代碼減少到了我無法工作的基本內容。Kivy ScreenManager - 更新標籤文本

ScreenManager代碼打破瞭解決方案,我知道什麼問題是我無法解決它。代碼工作,文本和時間更新在外殼但不是標籤,我不能將return self.first_screen添加到基維爾def build,所以它不綁定到the_time: _id_lbl_time - 任何幫助/指針將非常感激。

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() 

回答

0

我無法回報self.first_screen等在這裏?

號必須有對Screen部件的頂部ScreenManager,否則它只是一個RelativeLayout因爲這是它在源代碼中定義。

初學者遇到了一個非常常見的錯誤。你用一個實例FirstScreen()SecondScreen()ScreenManager(這些都是可見的),然後你創建了另一個實例,其中:

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

然後您可以用於Clock

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

,這意味着在實例text性質實際上沒有被添加到任何地方作爲小部件被用於更新。這些實例存在,所以除了可視化之外沒有錯誤觸發→你看不到值,因爲你使用了錯誤的實例。

正確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

是奏效 - 值得加入對未來搜索的是'建設(個體經營):'需要'迴歸sm'返回屏幕管理實際表現出來。 – northwarks

+0

是的,謝謝。編輯^^ – KeyWeeUsr