ConfigParserProperty 在 class kivy 中返回 val

ConfigParserProperty returning val inside class kivy

我正在关注kivy官方文档,我运行遇到了一个问题,这是我的代码,在底部我会解释哪里出了问题。

KV = '''
BoxLayout:
    TextInput:
        id: number
        text: str(app.number)
        on_text: app.number = self.text
    Label:
        id: info
        number: number.text
        text: 'Number: {}'.format(self.number)
''' 


class InfoApp(App):

    def build_config(self, config):
        config.setdefaults(
            'info',
            {
                'number': ''
            }
        )
    number = ConfigParserProperty(0, 'info', 'number', 'app',val_type=int)

    def build(self):
        print(self.number)
        return Builder.load_string(KV)


if __name__ == '__main__':
    InfoApp().run()

程序运行正常,但在构建函数中我打印了 self.number,即 returns 0 而不是存储在配置文件中的数字,我该如何解决这个问题,所以如果我添加更多构建函数中的计算小部件它会正确知道数字吗?

任何帮助将不胜感激! 谢谢!

ConfigParserProperty 设置构建后发生的事情,所以遗憾的是你不能依赖配置中可用的值 build 甚至 on_start 之后它会尽快更新,但以前没有发生过。

所以你有两个选择,要么将你的操作延迟固定的时间(使用Clock.schedule_once),要么在被调用函数中对值进行任何你想做的事情,或者(更好)绑定您感兴趣的 属性 的函数,因此每次值更改时都会调用它,这可能是您想要的,因为您需要根据此值刷新界面。

KV = '''
BoxLayout:
    TextInput:
        id: number
        text: str(app.number)
        on_text: app.number = self.text
    Label:
        id: info
        number: number.text
        text: 'Number: {}'.format(self.number)
''' 


class InfoApp(App):

    def build_config(self, config):
        config.setdefaults(
            'info',
            {
                'number': ''
            }
        )
    number = ConfigParserProperty(0, 'info', 'number', 'app',val_type=int)

    def build(self):
        self.bind(number=self.do_something)
        return Builder.load_string(KV)

    def do_something(self, *args):
        print(self.number)


if __name__ == '__main__':
    InfoApp().run()