如何在 Kivy 中动态更改标签背景颜色

Posted

技术标签:

【中文标题】如何在 Kivy 中动态更改标签背景颜色【英文标题】:How to change label background color dynamically in Kivy 【发布时间】:2019-11-26 13:57:21 【问题描述】:

我尝试制作一个简单的 ToDoList 程序。有添加、删除和执行按钮。但是我有一些关于标签颜色的错误。当我在滚动视图中单击“DO IT”按钮标签颜色更改但当我在其中一些完成时单击删除按钮时,彩色标签会更改。我确实使用了画布。我该如何解决这个问题?

class Home(Screen):

    def __init__(self,**kwargs):
        super(Home,self).__init__(**kwargs)

    def addWidget(self):
        task_input = self.ids.task_input.text
        newListItem = EachTask(text=task_input , 
        id=str((len(self.ids.add_field.children))) )
        print(newListItem.id)
        self.ids.add_field.add_widget(newListItem)
class EachTask(BoxLayout):
    def __init__(self, text= "", **kwargs):
        super(EachTask,self).__init__(**kwargs)
        self.ids.label.text = text

    def Do_Task(self,instance):
        child = instance.parent.parent
        with self.canvas.before:
            Color(.5,1,.2,1, mode='rgba')
            Rectangle(pos=child.ids.label.pos, size=child.ids.label.size)

kv_file

<FlatButton@ButtonBehavior+Label>:
    font_size: 15


<Home>:
    BoxLayout:
        id: home
        orientation: "vertical"
        spacing: 5
        #space_x: self.size[0]/2
        canvas.before:
            Color:
                rgba: (1,1,1,1)
            Rectangle:
                size: self.size
                pos: self.pos

    ##########HEADER#######
        BoxLayout:
            id: header
            size_hint_y: None
            height: 50
            canvas.before:
                Color:
                    rgba: (.85,.7,.2,1)
                Rectangle:
                    size: self.size
                    pos: self.pos
            Label:
                text: "TO DO LIST"
                font_size: "20sp"
                bold: True
                size_hint_x: .9
            FlatButton:
                text: "Back"
                size_hint_x: .1
    ####################################
        ScrollView:
            canvas.before:
                Color:
                    rgba: (1,1,.2,.2)
                Rectangle:
                    size: self.size
                    pos: self.pos
            BoxLayout:
                id: add_field
                size_hint_y: None
                height: self.minimum_height
                orientation: 'vertical'
                spacing: 2   #Spaces between childs
    #####################################################
        BoxLayout:
            id: input_field
            size_hint_y: None
            height: 80
            TextInput:
                id: task_input
                focus: True
                size_hint_x: .9
                multiline: False
            Button:
                font_size: "40sp"
                size_hint_x: .1
                text: "+"
                on_release: root.addWidget()
                id: button1
                color: 1,0.5,0.5,1
#######################################################
<EachTask>:
    size_hint_y: None
    height: 50
    id: each_task
    BoxLayout:
        Label:
            size_hint_x: .8
            id: label
            canvas.before:
                Color:
                    rgba: (1,.2,.2,.2)
                Rectangle:
                    size: self.size
                    pos: self.pos
        Button:
            size_hint_x: .1
            text: "X"
            on_release: app.root.ids.add_field.remove_widget(root)
        Button:
            size_hint_x: .1
            text: "DO IT"
            on_release: root.Do_Task(self)

【问题讨论】:

【参考方案1】:

需要对 kv 和 py 文件进行以下增强才能解决问题。

方法 1 - Kivy 自动创建并添加了一个 ObjectProperty,rgba

Kivy automatically created & added an ObjectProperty

如果小部件没有具有给定名称的属性,则 ObjectProperty 将被自动创建并添加到小部件中。

kv 文件

    添加类属性rgba并将其初始化为默认颜色(1, .2, .2, .2)到类规则&lt;EachTask&gt;: 将标签颜色替换为root.rgba

片段 - kv 文件

<EachTask>:
    rgba: (1,.2,.2,.2)    # Kivy auto created & added ObjectProperty, "rgba"
    ...
    BoxLayout:
        Label:
            size_hint_x: .8
            id: label
            canvas.before:
                Color:
                    rgba: root.rgba
                ...

py 文件

    删除方法Do_Task()中的所有代码 添加self.rgba = [.5, 1, .2, 1],其中self 指的是当前小部件,即EachTask 对象。

片段 - py 文件

def Do_Task(self, instance):
    self.rgba = [.5, 1, .2, 1]

方法 2 - 显式声明 rgba

kv 文件

    rgba: (1,.2,.2,.2) 替换为root.rgba

片段 - kv 文件

<EachTask>:
    ...
    BoxLayout:
        Label:
            size_hint_x: .8
            id: label
            canvas.before:
                Color:
                    rgba: root.rgba
                ...

py 文件

    添加导入语句,from kivy.properties import ListProperty 声明类属性,ListProperty 类型的rgba 并将其初始化为默认颜色,[1, .2, .2, .2] 在类EachTask() 删除方法Do_Task()中的所有代码 添加self.rgba = [.5, 1, .2, 1],其中self 指的是当前小部件,即EachTask 对象。

片段 - py 文件

from kivy.properties import ListProperty
...
class EachTask(BoxLayout):
    rgba = ListProperty([1, .2, .2, .2])
    ...
    def Do_Task(self, instance):
        self.rgba = [.5, 1, .2, 1]

【讨论】:

以上是关于如何在 Kivy 中动态更改标签背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

python - 如何在python的kivy app模块中更改屏幕背景的颜色?

Kivy 定义标签的背景颜色

Python Kivy - 更改标签颜色

Kivy 选项卡式面板不会更改背景颜色

Kivy:更改 ActionBar 的背景颜色

如何使用On_Press更改动态创建的小部件的BG颜色并使用Pickle保存? (与Kivy的Python)