【问题标题】:How to change label background color dynamically in Kivy如何在 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)

【问题讨论】:

    标签: python canvas label kivy


    【解决方案1】:

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

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

    Kivy automatically created & added an ObjectProperty

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

    kv 文件

    1. 添加类属性rgba并将其初始化为默认颜色(1, .2, .2, .2)到类规则&lt;EachTask&gt;:
    2. 将标签颜色替换为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 文件

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

    片段 - py 文件

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

    方法 2 - 显式声明 rgba

    kv 文件

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

    片段 - kv 文件

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

    py 文件

    1. 添加导入语句,from kivy.properties import ListProperty
    2. 声明类属性,ListProperty 类型的rgba 并将其初始化为默认颜色,[1, .2, .2, .2] 在类EachTask()
    3. 删除方法Do_Task()中的所有代码
    4. 添加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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2014-04-05
      相关资源
      最近更新 更多