【问题标题】:Kivy 1.10.1 updating a ScreenManager tag with a functionKivy 1.10.1 使用函数更新 ScreenManager 标签
【发布时间】:2018-09-30 10:11:48
【问题描述】:

我相信我的问题是运行 change_text() 函数时,ScreenManager: 部分中的 label_text 标记没有被更新。因为它只显示原始 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()

【问题讨论】:

    标签: python python-3.x kivy kivy-language


    【解决方案1】:

    首先,on_text_validate 只有在 TextInput 的 multiline 属性为 False 时才会被调用,所以设置它。

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

    Foo:
    

    <Foo>:
    

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

    【讨论】:

    • 感谢您的解释,它工作得很好。我会回去再读一遍 kivy.lang 文档!
    • 我认为您不需要 .kv 文件中的 manager 属性。当 Screen 添加到 ScreenManager 时,该属性应自动填充。
    • @JohnAnderson 我没有意识到,事实上你不应该建立那个属性,因为它是多余的。谢谢:-)
    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 2019-12-06
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多