Kivy:Switch从INI文件中读取值

Posted

技术标签:

【中文标题】Kivy:Switch从INI文件中读取值【英文标题】:Kivy: Switch reads the value from the INI file 【发布时间】:2022-01-21 00:48:28 【问题描述】:
kvstring = Builder.load_string('''
<AccParGui>:
    BoxLayout:
        orientation: "vertical"
        Accordion:
             AccordionItem:
                title: 'EIP'
                BoxLayout:
                     Button:
                        text: 'Into EIP'
                     GridLayout:
                        cols: 2
                        Label:
                            text: "refresh: "
                        Switch:
                            id: switch_eip_refresh
                            active: True
                            on_active: root.switch_eip_callback()
        AccordionItem:
            title: 'About'
            Label:
                text: 'Financial work aids'
''')

class BrowserPlatform():
    def switch_eip_callback():
        if self.set_refresh:
            accpar_config.set('General', 'set_refresh', 'False') #write INI
            self.ids.switch_eip_refresh.active = False
            self.set_refresh = False
            self.event_homepage_refresh.cancel()
        else:
            accpar_config.set('General', 'set_refresh', 'True')
            self.ids.switch_eip_refresh.active = True
            self.set_refresh = True
            self.event_homepage_refresh = Clock.schedule_interval(
            self.eip_refresh, self.set_refresh_time)

class AccParGui(Widget, BrowserPlatform
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.ids.switch_eip_refresh.active = accpar_config.getboolean('General', 'set_refresh')
        # read from ini

class AccParGuiApp(App):
    def build(self):
        return AccParGui()

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


我使用 Switch 来切换值。如果 .INI 文件中读取的 Switch 值为 False,则自动执行 on_active 事件(True is not )。 我理解 Switch 的值是属性,Kivy 是自动监控的。即使我不点击切换。但我的意图是只通过点击来改变。我怎样才能做到这一点?希望有人指教,谢谢!

【问题讨论】:

【参考方案1】:

on_active 事件在active 属性更改时触发。由于您的Switchactive: True 开头,因此您的.INI 中的True 值不会发生更改,也不会触发事件。

保护switch_eip_callback() 方法不被意外执行的一个丑陋的技巧是设置一个布尔变量(可能命名为ignore_active_change),并在switch_eip_callback() 中检查该变量。如果该变量是True,只需将其设置回False 并返回即可。

这是我的意思的一个简单示例:

class AccParGuiApp(App):
    def build(self):
        root = Builder.load_string(kvstring)
        self.ignore_switch_activity = True  # ignore any changes in switch activity
        root.ids.switch_eip_refresh.active = Config.getboolean('app', 'switch')
        self.ignore_switch_activity = False  # stop ignoring
        return root

    def switch_eip_callback(self):
        if self.ignore_switch_activity:
            print('ignoring switch')
        else:
            print('not ignoring switch')

【讨论】:

我是 Python 新手,想了一天还是不知道。能给个sn-p代码吗?谢谢 非常感谢您对新手的细心帮助! 仔细看,感觉你的代码有问题: self.ignore_switch_activity = True -------- 是 true ,但是第三行变成了 false 。如果在函数中再次判断,手动点击时需要点击两次 build() 方法中的代码阻止使用触发代码加载使用Config 的开关设置。它被设置回 False 以允许触发。

以上是关于Kivy:Switch从INI文件中读取值的主要内容,如果未能解决你的问题,请参考以下文章

C++ 读取INI文件

Android kivy 在哪里放置应用程序文件(ini、图像数据库等)

使用 GetPrivateProfileString 读取所有 ini 文件值

创建ini文件,用PHP写入值

delphi中怎么读取ini文件第2行

PowerShell 从简单的 .ini 文件中读取单个值