2016-12-30 55 views
1

ラベルの更新に関する質問(Kivy change label text with python) - それは答えられていましたが、動作していましたが、実行中のコードをScreenManagerに適応しようと何時間も試みています。私はコードを、私が働くことができない基本的なものに切り詰めました。Kivy ScreenManager - ラベルのテキストを更新する

ScreenManagerコードがソリューションを壊し、私はこの問題は、私はちょうどそれを解決することはできませんが何であるかを知っています。コードは動作していますが、ラベルは表示されませんが、ラベルは表示されません。をKivy 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など返すことはできませんか?

号それ以外の場合は、ソースコード内の定義であるとしてだけRelativeLayoutだ、Screenウィジェットの上にScreenManagerがなければなりません。

あなたは初心者の間で本当によくある間違いを経験しました。あなたは(それらが表示されている)ScreenManagerのために1つのインスタンスFirstScreen()SecondScreen()を使用して、あなたが別のインスタンスを作成:

あなたが Clockに使用
self.first_screen = FirstScreen() 
self.sec_screen = SecondScreen() 

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'が実際にそれを表示するScreenManagerのを返すようにする必要があります。 – northwarks

+0

はい、ありがとうございます。編集済み^^ – KeyWeeUsr

関連する問題