动态更新的Kivy设置条目

时间:2015-10-15 20:27:35

标签: python kivy

Kivy拥有这个非常棒的内置功能,可以为您的应用创建设置面板。 它为您提供了一组可以使用的条目类型,如字符串,bool,选项等。 但所有这些选项都在json文件中进行了硬编码,如果有动态的话,你会怎么做?

如何在Kivy中动态更改设置菜单?

具体来说,我需要一个用于串行连接的设置面板。我的应用程序的用户需要选择他想要连接的现有串口。这个列表可以在python中获得,但它可以随时更改,那么如何使我的设置菜单保持最新的当前COM端口可用性?

1 个答案:

答案 0 :(得分:2)

可能有几种方法可以做到这一点。这是其中之一:

创建一种新类型的设置,它接受一个函数作为字符串,它将包含每次用户想要查看列表时要调用的函数的完整路径:

class SettingDynamicOptions(SettingOptions):
'''Implementation of an option list that creates the items in the possible
options list by calling an external method, that should be defined in
the settings class.
'''

function_string = StringProperty()
'''The function's name to call each time the list should be updated.
It should return a list of strings, to be used for the options.
'''

def _create_popup(self, instance):
    # Update the options
    mod_name, func_name = self.function_string.rsplit('.',1)
    mod = importlib.import_module(mod_name)
    func = getattr(mod, func_name)
    self.options = func()

    # Call the parent __init__
    super(SettingDynamicOptions, self)._create_popup(instance)

它是来自SettingOptions的子类,它允许用户从下拉列表中进行选择。每次用户按下设置以查看可能的选项时,都会调用_create_popup方法。新的overriden方法动态导入函数并调用它来更新类的options属性(它反映在下拉列表中)。

现在可以在json中创建这样的设置项:

    {
    "type": "dynamic_options",
    "title": "options that are always up to date",
    "desc": "some desc.",
    "section": "comm",
    "key": "my_dynamic_options",
    "function_string": "my_module.my_sub_module.my_function"
    },

还需要通过继承Kivy的设置类来注册新的设置类型:

class MySettings(SettingsWithSidebar):
'''Customized settings panel.
'''
def __init__(self, *args, **kargs):
    super(MySettings, self).__init__(*args, **kargs)
    self.register_type('dynamic_options', SettingDynamicOptions)

并将其用于您的应用:

def build(self):
    '''Build the screen.
    '''
    self.settings_cls = MySettings