Python Kivy ScreenManager-更新标签文本
我问了一个关于更新标签文本()的问题-它得到了回答并且正在工作,但我已经尝试了几个小时,试图将我运行的代码调整为Python Kivy ScreenManager-更新标签文本,python,label,kivy,Python,Label,Kivy,我问了一个关于更新标签文本()的问题-它得到了回答并且正在工作,但我已经尝试了几个小时,试图将我运行的代码调整为ScreenManager,这样我就可以有多个屏幕了。我已经把代码删减到基本的东西了,我无法工作 ScreenManagercode破坏了解决方案,我知道问题出在哪里,就是解决不了。代码正在运行,文本和时间在shell中更新,但标签没有更新,我无法添加返回self。首先,将屏幕添加到Kivydef build,因此它不绑定到时间:\u id\u lbl\u time-非常感谢任何帮助/
ScreenManager
,这样我就可以有多个屏幕了。我已经把代码删减到基本的东西了,我无法工作
ScreenManager
code破坏了解决方案,我知道问题出在哪里,就是解决不了。代码正在运行,文本和时间在shell中更新,但标签没有更新,我无法添加返回self。首先,将屏幕添加到Kivydef build
,因此它不绑定到时间:\u id\u lbl\u 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()
从kivy.app导入应用
从kivy.base导入runTouchApp
从kivy.lang导入生成器
从kivy.properties导入ListProperty、StringProperty、ObjectProperty
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.screenmanager导入screenmanager、Screen、WipeTransition、FadeTransition
从kivy.uix.anchorlayout导入anchorlayout
从kivy.clock导入时钟
导入时间
从datetime导入datetime,timedelta
类第一屏幕(屏幕):
def更新时间(自身,秒):
MyTime=time.strftime(“%H:%M:%S”)
打印我的时间#测试更新#调用etc时间
self.the_time.text=MyTime#
我不能返回self.first\u屏幕等
不可以。在屏幕
小部件的顶部必须有一个屏幕管理器
,否则它只是一个相对值
,就像它在源代码中的定义一样
你遇到了一个初学者经常犯的错误。您将一个实例FirstScreen()
和SecondScreen()
用于ScreenManager
(这些都是可见的),然后使用以下内容创建了另一个实例:
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()
:
我不能返回self.first\u屏幕等
不可以。在屏幕
小部件的顶部必须有一个屏幕管理器
,否则它只是一个相对值
,就像它在源代码中的定义一样
你遇到了一个初学者经常犯的错误。您将一个实例FirstScreen()
和SecondScreen()
用于ScreenManager
(这些都是可见的),然后使用以下内容创建了另一个实例:
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()
:
是的,这很有效-值得为将来的搜索者添加build(self):
需要返回sm
才能返回屏幕管理器以实际显示它。是的,这很有效-值得为将来的搜索者添加build(self):
需要返回sm
才能返回屏幕管理器以实际显示它。