Kivy 1.10.1 使用函数更新 ScreenManager 标签
Kivy 1.10.1 updating a ScreenManager tag with a function
我认为我的问题是当 change_text() 函数为 run.Because 它只显示原始的 label_text 值,在这种情况下什么都没有。
有谁知道如何更新标签?我的目标是能够在 2 Screen 类 之间传递字符串。因此,当用户在前一个屏幕上输入邮政编码之类的内容时,我可以将其传递到新屏幕。
#:kivy 1.1.3
ScreenManager:
id: screen_manager
SearchScreen:
id: search_screen
name: 'SearchScreen'
manager: screen_manager
ForecastScreen:
id: forecast_screen
name: 'ForecastScreen'
manager: screen_manager
label_text: search_screen.text
<SearchScreen>:
display: entry
FloatLayout:
TextInput:
id: entry
on_text_validate:
root.change_text()
<ForecastScreen>:
BoxLayout:
FloatLayout:
Label:
text:root.label_text
然后是py代码:
class SearchScreen(Screen):
text = StringProperty('')
def change_text(self):
self.text = "show this text"
self.manager.current = "ForecastScreen"
class ForecastScreen(Screen):
label_text = StringProperty()
Builder.load_file('weather.kv')
sm = ScreenManager()
sm.add_widget(SearchScreen(name='SearchScreen'))
sm.add_widget(ForecastScreen(name='ForecastScreen'))
class WeatherApp(App):
def build(self):
return sm
if __name__ == "__main__":
WeatherApp().run()
首先,如果 TextInput 的多行 属性 设置为 False,on_text_validate 只会在您按下回车时调用,因此请设置它。
另一方面,我发现您不明白以下两者之间的区别:
Foo:
和
<Foo>:
在第一种情况下,您正在创建 Foo 的实例(并且只能有一个这种类型的元素),在第二种情况下,您正在实现一个组件。当您调用 Builder.load_file()
并且第一个元素没有 "<" ">" 时,该实例是 returned,也就是说,已经有一个 ScreenManager,但在您的情况下,您已经创建了另一个带有 python代码。在 .kv 中实例化的 ScreenManager 已经具有文本已链接的 Screen,而在 Python 的更改中则没有。当您 return 在 python 中创建的 ScreenManager 没有链接元素时,您会观察到正确的行为,不会修改任何内容。
您需要做的是从 .py 中删除 ScreenManager 并使用 .kv:
*.py
class SearchScreen(Screen):
text = StringProperty('')
def change_text(self):
self.text = "show this text"
self.manager.current = "ForecastScreen"
class ForecastScreen(Screen):
label_text = StringProperty("")
sm = Builder.load_file('weather.kv')
class WeatherApp(App):
def build(self):
return sm
if __name__ == "__main__":
WeatherApp().run()
*.kv
ScreenManager:
id: screen_manager
SearchScreen:
id: search_screen
name: 'SearchScreen'
ForecastScreen:
id: forecast_screen
name: 'ForecastScreen'
label_text: search_screen.text
<SearchScreen>:
display: entry
FloatLayout:
TextInput:
id: entry
multiline: False # <----
on_text_validate:
root.change_text()
<ForecastScreen>:
BoxLayout:
FloatLayout:
Label:
text: root.label_text
我认为我的问题是当 change_text() 函数为 run.Because 它只显示原始的 label_text 值,在这种情况下什么都没有。
有谁知道如何更新标签?我的目标是能够在 2 Screen 类 之间传递字符串。因此,当用户在前一个屏幕上输入邮政编码之类的内容时,我可以将其传递到新屏幕。
#:kivy 1.1.3
ScreenManager:
id: screen_manager
SearchScreen:
id: search_screen
name: 'SearchScreen'
manager: screen_manager
ForecastScreen:
id: forecast_screen
name: 'ForecastScreen'
manager: screen_manager
label_text: search_screen.text
<SearchScreen>:
display: entry
FloatLayout:
TextInput:
id: entry
on_text_validate:
root.change_text()
<ForecastScreen>:
BoxLayout:
FloatLayout:
Label:
text:root.label_text
然后是py代码:
class SearchScreen(Screen):
text = StringProperty('')
def change_text(self):
self.text = "show this text"
self.manager.current = "ForecastScreen"
class ForecastScreen(Screen):
label_text = StringProperty()
Builder.load_file('weather.kv')
sm = ScreenManager()
sm.add_widget(SearchScreen(name='SearchScreen'))
sm.add_widget(ForecastScreen(name='ForecastScreen'))
class WeatherApp(App):
def build(self):
return sm
if __name__ == "__main__":
WeatherApp().run()
首先,如果 TextInput 的多行 属性 设置为 False,on_text_validate 只会在您按下回车时调用,因此请设置它。
另一方面,我发现您不明白以下两者之间的区别:
Foo:
和
<Foo>:
在第一种情况下,您正在创建 Foo 的实例(并且只能有一个这种类型的元素),在第二种情况下,您正在实现一个组件。当您调用 Builder.load_file()
并且第一个元素没有 "<" ">" 时,该实例是 returned,也就是说,已经有一个 ScreenManager,但在您的情况下,您已经创建了另一个带有 python代码。在 .kv 中实例化的 ScreenManager 已经具有文本已链接的 Screen,而在 Python 的更改中则没有。当您 return 在 python 中创建的 ScreenManager 没有链接元素时,您会观察到正确的行为,不会修改任何内容。
您需要做的是从 .py 中删除 ScreenManager 并使用 .kv:
*.py
class SearchScreen(Screen):
text = StringProperty('')
def change_text(self):
self.text = "show this text"
self.manager.current = "ForecastScreen"
class ForecastScreen(Screen):
label_text = StringProperty("")
sm = Builder.load_file('weather.kv')
class WeatherApp(App):
def build(self):
return sm
if __name__ == "__main__":
WeatherApp().run()
*.kv
ScreenManager:
id: screen_manager
SearchScreen:
id: search_screen
name: 'SearchScreen'
ForecastScreen:
id: forecast_screen
name: 'ForecastScreen'
label_text: search_screen.text
<SearchScreen>:
display: entry
FloatLayout:
TextInput:
id: entry
multiline: False # <----
on_text_validate:
root.change_text()
<ForecastScreen>:
BoxLayout:
FloatLayout:
Label:
text: root.label_text