2016-12-30 6 views
1

Я задал вопрос об обновлении текста ярлыка (Kivy change label text with python) - на него был дан ответ и он работал, но я пытался часами пытаться адаптировать мой текущий код к ScreenManager, чтобы у меня было несколько экранов. Я сократил код до основного материала, с которым я не могу работать.Kivy ScreenManager - Обновление текста ярлыка

ScreenManager код нарушает решение, я знаю, в чем проблема, я просто не могу ее решить. Код работает, текст и время обновления в оболочке, но не ярлыки, я не мог добавить return self.first_screen в 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 и т.д. здесь?

No. Там должно быть ScreenManager поверх Screen виджетов, в противном случае это просто 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' вернуть ScreenManager на самом деле показать. – northwarks

+0

Да, спасибо. Отредактировано ^^ – KeyWeeUsr

Смежные вопросы