【问题标题】:Reset kivy settings to original values将kivy设置重置为原始值
【发布时间】:2020-09-08 10:22:25
【问题描述】:

我正在构建一个应用程序,并且想知道如何将 kivy 设置重置为其默认值。此外,是否可以添加一个将设置重置为其默认值的按钮。这是我的代码:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.settings import SettingsWithSidebar
from plyer.facades.storagepath import StoragePath
import plyer, json

settings_json = json.dumps([
    {'type': 'title',
     'title': 'example title'},
    {'type': 'bool',
     'title': 'A boolean setting',
     'desc': 'Boolean description text',
     'section': 'example',
     'key': 'boolexample'},
    {'type': 'numeric',
     'title': 'A numeric setting',
     'desc': 'Numeric description text',
     'section': 'example',
     'key': 'numericexample'},
    {'type': 'options',
     'title': 'An options setting',
     'desc': 'Options description text',
     'section': 'example',
     'key': 'optionsexample',
     'options': ['option1', 'option2', 'option3']},
    {'type': 'string',
     'title': 'A string setting',
     'desc': 'String description text',
     'section': 'example',
     'key': 'stringexample'},
    {'type': 'path',
     'title': 'Download Folder Path',
     'desc': "All downloaded manga will be found in this folder called 'manga_downloader_root' ",
     'section': 'example',
     'key': 'pathexample'}])

Builder.load_string('''
<Interface>:
    orientation: 'vertical'
    Button:
        text: 'open the settings!'
        font_size: 150
        on_release: app.open_settings()
        on_press: app.destroy_settings()
''')

class Interface(BoxLayout):
    pass

class SettingsApp(App):
    def build(self):
        self.settings_cls = SettingsWithSidebar
        self.use_kivy_settings = False
        setting = self.config.get('example', 'pathexample')
        print(setting)
        print(plyer.storagepath.get_downloads_dir())
    
        return Interface()

    def build_config(self, config):
        user_downloads_dir = plyer.storagepath.get_downloads_dir()

        config.setdefaults('example', {
            'boolexample': True,
            'numericexample': 10,
            'optionsexample': 'option2',
            'stringexample': 'some_string',
            'pathexample': user_downloads_dir })

    def build_settings(self, settings):
        settings.add_json_panel('Panel Name', self.config, data=settings_json)
        
    def on_config_change(self, config, section, key, value):
        print (config, section, key, value)
if __name__ == "__main__":
   SettingsApp().run()

关于更多上下文,我希望让这个应用程序在 android 和 PC 上都能运行。是否也可以将此代码合并到可以通过图标打开的导航栏中。

【问题讨论】:

    标签: python kivy kivymd


    【解决方案1】:

    所以我不久前就想到了这一点,我将为找到此问题的任何人发布一个最低限度的答案。我的解决方案使用来自 Github post 的这段代码。

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.button import Button
    from kivy.uix.settings import SettingItem, SettingsWithSpinner
    import plyer, json
    
    settings_json = json.dumps([
        {
            'type': 'title',
            'title': 'example title'
        },
    
        {
            'type': 'bool',
            'title': 'A boolean setting',
            'desc': 'Boolean description text',
            'section': 'example',
            'key': 'boolexample'
        },
    
        {
            'type': 'numeric',
            'title': 'A numeric setting',
            'desc': 'Numeric description text',
            'section': 'example',
            'key': 'numericexample'
         },
    
        {
            'type': 'options',
            'title': 'An options setting',
            'desc': 'Options description text',
            'section': 'example',
            'key': 'optionsexample',
            'options': ['option1', 'option2', 'option3'] 
        },
    
        {
            'type': 'string',
            'title': 'A string setting',
            'desc': 'String description text',
            'section': 'example',
            'key': 'stringexample'
        },
    
        {
            'type': 'path',
            'title': 'Download Folder Path',
            'desc': "All downloaded manga will be found in this folder called 'manga_downloader_root' ",
            'section': 'example',
            'key': 'pathexample'
        },
    
        # Added a button to reset the settings
        {
           "type":"buttons",
           "title":"Reset Settings",
           "desc":"Reset the settings to their default values",
           "section":"Settings",
           "key":"configchangebuttons",
           "buttons":[{"title":"Reset Settings", "id":"reset_settings_btn"}]
        }
             
    ])
    
    class Interface(BoxLayout):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            self.add_widget(Button(text="Open Settings", on_release=App.get_running_app().open_settings))
    
    # Class to create a button-type settings item
    class SettingButtons(SettingItem):
        def __init__(self, **kwargs):
            # For Python3 compatibility we need to drop the buttons keyword when calling super.
            kw = kwargs.copy()
            kw.pop('buttons', None)
            super(SettingItem, self).__init__(**kw)
            
            for aButton in kwargs["buttons"]:
                oButton=Button(text=aButton['title'], font_size= '15sp', on_release=self.on_button_press)
                oButton.ID=aButton['id']
                self.add_widget(oButton)
        
        def set_value(self, section, key, value):
            # set_value normally reads the configparser values and runs on an error (to do nothing here)
            return
        
        def on_button_press(self,instance):
            self.panel.settings.dispatch('on_config_change',self.panel.config, self.section, self.key, instance.ID)
    
    
    class ScrollableSettings(SettingsWithSpinner):
        def __init__(self, *args, **kwargs):
            super().__init__(*args,**kwargs)
            self.settings_types = [('buttons', SettingButtons)] # 'buttons' is the name of the settings type
    
            # Registers any new settings types
            for type_ in self.settings_types:
                self.register_type(*type_)
    
    
    class SettingsApp(App):
        default_settings = {
                'boolexample': True,
                'numericexample': 10,
                'optionsexample': 'option2',
                'stringexample': 'some_string',
                'pathexample': plyer.storagepath.get_downloads_dir() 
        }
        
        def build(self):
            self.settings_cls = ScrollableSettings
            self.use_kivy_settings = False
            #setting = self.config.get('example', 'pathexample')
        
            return Interface()
    
        def build_config(self, config):
            config.setdefaults('example', self.default_settings)
    
        def build_settings(self, settings):
            settings.add_json_panel('Panel Name', self.config, data=settings_json)
            
        def on_config_change(self, config, section, key, value):
            print (config, section, key, value)
    
            if key == "configchangebuttons":
                # Reset config to defaults and write new vals 
                config.setall('example', self.default_settings)
                config.write()
                # Refreshes the settings menu to show that the default settings have been applied
                self.close_settings()
                self.destroy_settings()
                self.open_settings()
    
    if __name__ == "__main__":
       SettingsApp().run()
    
    

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      相关资源
      最近更新 更多