如何为Kivy中的设置创建自定义类型?

4 投票
1 回答
2193 浏览
提问于 2025-04-18 07:28

我想在Kivy的设置面板中添加一个选择颜色的功能,用来为我的应用程序的一些线条、背景等选择颜色。

我已经在Kivy的设置面板中添加了一种新的颜色选择器类型,基本上快要成功了。但是我遇到一个问题,就是当前选中的颜色的值没有在设置面板中显示出来。(缺少的文本在下面截图中的红圈里)

值文本缺失

我觉得这个问题应该很简单,但我还没有找到解决办法。我的类叫做SettingColorPicker(基类是SettingItem),如果我把它改名为SettingString并删除原来的SettingString类,它就能正常工作。我不知道为什么会这样?!

我这样注册了新的类型:

   s = Settings()
   s.register_type('colorpicker', SettingColorPicker)

我的其余代码和SettingPath类的代码很相似。我只是创建了一个颜色选择器,而不是文件选择器。

那位置的标签是从哪里获取它的值的呢?我在源代码中没有找到相关内容,链接在这里:https://github.com/kivy/kivy/blob/master/kivy/uix/settings.py

我还想把那个标签中的文本颜色改成当前选中的颜色。我该怎么做呢?不过如果我明白标签是怎么创建的,这个应该不难。

这是我点击“BG color”文本时的样子(这是Kivy中包含的颜色选择器): 颜色选择器运行中

你可以在这里找到源代码: https://gist.github.com/AWolf81/421976e65099d3e58a32

你可以直接运行它,看看描述的问题。

1 个回答

4

好的,正如预期的那样,解决办法其实很简单。

我在Kivy的文件里找到了SettingString,发现了一个kv文件,路径是C:\Kivy-1.8.0-py2.7-win32\kivy\kivy\data\style.kv:

    731: <SettingString>:
    732:      Label:
    733:          text: root.value or ''

这就是为什么重命名的类名能正常工作。只是新类型的KV定义缺失了。

添加以下几行代码就解决了这个问题:

    from kivy.lang import Builder
    Builder.load_string(
    '''
    <SettingColorPicker>:
        Label:
            text: root.value or ''
    ''')

我把这些代码加到了我创建SettingColorPicker类的文件里。你也可以直接把它加到'style.kv'文件里,这样也应该能行,但我没有测试过。

给颜色上色也很简单,只需要用root.value来设置标签的颜色。请注意,你需要把它转换成rgba格式的元组,方法是用kivy.utils.get_color_from_hex(root.value)。

带颜色的工作示例

撰写回答