首页 > 解决方案 > 在 kivy 中,是否可以更改微调器中子元素的颜色?

问题描述

我正在用 kivy 做一个小应用程序。在我选择了微调器中的一个元素后,我不希望它在下一轮看起来相同,以便用户知道为此值输入了一个值。我想改变它的颜色。只为这个元素。是否可以?

.kv 文件

    Spinner:
        id: sliderComponents
        visible: False
        opacity: 1 if self.visible else 0
        disabled: not self.visible
        text: "<Component...>"
        values: ("Component A", "Component B", "Component C", "Component D", "Component E", "Component F", "Component G", "Component H", "Component I")
        pos_hint: {'x': 0.5, 'y': 0.5}

因此,如果我选择“组件 B”,我希望它具有不同的颜色。只是“组件B”

谢谢!

标签: pythonkivy

解决方案


是的,有可能。

  1. 实现类型的动态类或类规则SpinnerOption
  2. 按下或释放按钮时将更改为background_color您想要的颜色(使用按钮on_presson_release事件)

片段 - kv 文件

<CustomSpinnerOptions@SpinnerOption>:
    background_normal: ''
    background_color: 0, 0, 1, 1      # blue

    on_release: 
        self.background_color=1, 1, 0, 1    # yellow

例子

以下示例使用 kv 文件和 Python 脚本。

主文件

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder


Builder.load_string("""
#:import Factory kivy.factory.Factory

<CustomSpinnerOptions@SpinnerOption>:
    background_normal: ''
    background_color: 0, 0, 1, 1      # blue

    on_release: 
        self.background_color=1, 1, 0, 1    # yellow

<CustomDropdown@DropDown>:
    max_height: 300
    bar_width: 5
    bar_color: 0, 1, 0, 1   # green
    bar_inactive_color: 1, 0, 0, 1  # red        
    effect_cls: 'ScrollEffect'
    scroll_type: ['bars', 'content']


<CustomSpinner@Spinner>:
    canvas.before:
        Color:
            rgba: 1, 1, 1, 1
        Rectangle:
            size: self.size
            pos: self.pos

    background_normal: ''
    background_color: 1, 1, 1, 1  # white
    color: 0, 0, 0, 1

    text: '<Component...>'
    values: [ "Component A", "Component B", "Component C", "Component D", "Component E", "Component F", "Component G", "Component H", "Component I" ]

    size_hint: (None, None)
    size: 200, 48
    sync_height: True
    pos_hint: {'center_x': .5, 'center_y': .5}

    on_text:
        app.root.show_selected_value(self, self.text)

    dropdown_cls: Factory.CustomDropdown
    option_cls: Factory.CustomSpinnerOptions


<RootWidget>:
    cols: 1

    CustomSpinner:

""")


class RootWidget(GridLayout):

    def show_selected_value(self, spinner, text):
        print('The spinner', spinner, 'have text', text)


class SpinnerDemoApp(App):
    title = 'Spinner Demo - Change selected button colour'

    def build(self):
        return RootWidget()


if __name__ == "__main__":
    SpinnerDemoApp().run()

输出

选择前 已选中 所选项目颜色已更改 多个选定的项目


推荐阅读