Kivy 1.10.1使用函数更新ScreenManager标签

2024-10-02 02:30:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我认为我的问题在于运行change_text()函数时,ScreenManager:部分中的label_text标记没有被更新。因为它只显示原始label_text值,在本例中,该值为零

有人知道如何更新标签吗?我的目标是能够在两个屏幕类之间传递字符串。因此,当用户在上一个屏幕上输入类似邮政编码的内容时,我可以将其传递到新屏幕

#: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()

Tags: textnameselfidsearch屏幕managerchange
1条回答
网友
1楼 · 发布于 2024-10-02 02:30:44

首先,如果TextInput的multiline属性为False,则仅当按enter键时才会调用on_text_validate,因此请将其设置为False

另一方面,我发现您不理解以下两者之间的区别:

Foo:

<Foo>:

在第一种情况下,您正在创建一个Foo实例(并且只能有一个这种类型的元素),在第二种情况下,您正在实现一个组件。当您调用Builder.load_file()并且第一个元素没有“<;”>;”返回该实例,也就是说,已经有一个ScreenManager,但是在您的例子中,您已经用python代码创建了另一个。在.kv中实例化的ScreenManager已经有了文本链接的屏幕,而Python的更改则没有。当您返回在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

相关问题 更多 >

    热门问题