【发布时间】:2014-08-09 21:55:36
【问题描述】:
我遇到了标签的更新文本属性在我的 UI 上未正确显示的问题。我检查了 text 属性,可以验证它是否被设置为新值,但在呈现标签时该值没有显示。
标签位于另一个屏幕上,我正在使用 ScreenManager 切换到该屏幕。屏幕的 Sub Widgets 和树是在单独的 .kv 文件中构建的(我在示例中使用了 load_string() Builder 方法,但结果相同)
这是一个简单的例子:
from kivy.config import Config
Config.set('graphics', 'width', '300')
Config.set('graphics', 'height', '200')
Config.set('graphics', 'resizable', '0')
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
Builder.load_string("""
<screen1>:
Button:
id: button
text: 'Press me to Update Screen2'
on_press:
root.update_screen2()
<screen2>:
Label:
id: mainLabel
text: 'I have not been updated'
""")
class screen1(Screen):
def __init__(self, **kwargs):
"""
Set super and store the id of the button
"""
super(screen1, self).__init__(**kwargs)
self.button = self.ids.button.__self__
return
def update_screen2(self):
"""
send text 1 and text 2 to the screen2 object
for it to set on it's label
"""
text1 = 'Hi There'
text2 = 'Does this work'
screen2.update_label(screen2(),text1, text2)
return
class screen2(Screen):
def __init__(self, **kwargs):
"""
set super ond store the id of the label
"""
super(screen2, self).__init__(**kwargs)
self.mainLabel = self.ids.mainLabel.__self__
return
def update_label(self, text1, text2):
"""
using text1 and text2, update the text property of the label
the output of each print() shows the text property is being updated
it just doesn't display on the UI
"""
print(self.mainLabel.text)
self.mainLabel.text = text1 + '\n\n' + text2
print(self.mainLabel.text)
screenManager.current = 'screen2'
return
screenManager = ScreenManager()
class MainApp(App):
def build(self):
#root widget is abox layout
self.root = BoxLayout()
#instantiate the screen objects
self.screen1 = screen1(name='screen1')
self.screen2 = screen2(name='screen2')
#add the screens to the screenManager
screenManager.add_widget(self.screen1)
screenManager.add_widget(self.screen2)
#set the current screen
screenManager.current = 'screen1'
#add the screenManager to the root widget and return it
self.root.add_widget(screenManager)
return self.root
if __name__ == '__main__':
MainApp().run()
我尝试了各种方法,例如更改我在 python 中引用标签小部件的方式、要求画布更新或创建一个“screen2()”对象以从 screen1 中调用该方法,但无济于事。 我错过了什么?
【问题讨论】:
标签: python user-interface text label kivy