簡體   English   中英

如何在 Kivy 中動態更改標簽背景顏色

[英]How to change label background color dynamically in Kivy

我嘗試制作一個簡單的 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)

需要對 kv 和 py 文件進行以下增強才能解決問題。

方法 1 - Kivy 自動創建並添加了一個 ObjectProperty, rgba

Kivy 自動創建並添加了一個 ObjectProperty

如果小部件沒有給定名稱的屬性,則會自動創建一個ObjectProperty並將其添加到小部件中。

kv文件

  1. 添加類屬性rgba並將其初始化為默認顏色(1, .2, .2, .2)到類規則<EachTask>:
  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. root.rgba替換rgba: (1,.2,.2,.2)

片段 - kv 文件

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

py文件

  1. 添加import語句, from kivy.properties import ListProperty
  2. 在類EachTask()聲明類屬性, ListProperty類型的rgba並將其初始化為默認顏色[1, .2, .2, .2]
  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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM