无法动态更新 Kivy 标签文本

Not able to Dynamical Update Kivy Label Text

我正在尝试向 table 之类的 GUI 添加行。 这些行将是标签列表。 更新的每一行都有以下方法 class:

然后我为此 class 初始化了对象列表 ContentList[] 并调用方法 但是无论调用哪个对象的ChangeLabelText,都只会更新ContentList[0]的文本。

import json
import requests
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.lang import Builder
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
from kivy.uix.button import Button
from kivy.app import runTouchApp

class AddContent(GridLayout):
    #response = requests.get("http://localhost:10010/")
    # Get the response data as a python object.  Verify that it's a dictionary.
    #data = response.json()[3]
    #Column_keys = ["country", "date", "answered_calls", "total_calls", "asr", "mou", "aou"]
    RowList = []
    Label_List = []
    size = 0
    def AddRow(self, InputList):
        self.RowList = InputList
        self.size = len(InputList)

    def AddLabel(self,LayoutObj):
        lbl = Label(size_hint_y = None, height = 30)
        LayoutObj.add_widget(lbl)
        return lbl

    def AddLabelRow(self,LayoutObj):
        for i in range(self.size):
            Lbl = self.AddLabel(LayoutObj)
            Lbl.text = "empty"
            #self.Label_List[i].text = data[Column_keys[i]]
            #Lbl.text = str(self.data[self.Column_keys[i]])
            self.Label_List.append(Lbl)

    def ChangeLabel_ListText(self, TextList):
        for i in range(self.size):
            #self.Label_List[i].text = data[Column_keys[i]] #data is fetched from Db
            self.Label_List[i].text  = TextList[i]



class TableView(GridLayout):
    Col_Names = ["Date","Vendor","Country","MOU","ASR","AOU"]
    ContentList = [AddContent(),AddContent(),AddContent()]
    def __init__(self,**kwargs):
        self.layout  = GridLayout(cols = len(self.Col_Names), padding =5)
        self.layout.bind(minimum_height=self.layout.setter('height'))
        for i in range(len(self.Col_Names)):
            btn = Button(text=self.Col_Names[i], size_hint_y=None, height=30)
            self.layout.add_widget(btn)

        self.ContentList[0].AddRow(['1sample1','1sample2','1sample3','1sample4','1sample5','1sample6'])
        self.ContentList[1].AddRow(['2sample1','2sample2','2sample3','2sample4','2sample5','2sample6'])
        self.ContentList[2].AddRow(['3sample1','3sample2','3sample3','3sample4','3sample5','3sample6'])

        for i in range(3):
            self.ContentList[i].AddLabelRow(self.layout)

        self.ContentList[2].ChangeLabel_ListText(['a','b','c','d','e','f'])

if __name__ == '__main__':
    Table = TableView()
    runTouchApp(Table.layout)

self.ContentList[2].ChangeLabel_ListText(['a','b','c','d','e','f']) 仅更新第一行,无论为索引指定的数字是多少。

在过去的一周里,我一直为此伤脑筋。我最初只使用一个 class 而不是两个给出相同输出的方法来完成此操作。 任何帮助都会有很大帮助。谢谢!

您的第一个问题是 RowList、Label_List 和大小是代码中的 class 属性。但是您想在每个 实例 中单独设置它们。解决方案:在 __init__ 方法中初始化这些属性,如下所示:

def __init__(self, **kwargs):
    super(AddContent, self).__init__(**kwargs)
    self.RowList = []
    self.Label_List = []
    self.size = 0 

第二个问题是,GridLayout(您的 class 是子class)也包含一个名为 size 的属性。解决方案:为此属性选择一个不同的名称,如下所示:

    self.length = 0

如果你现在这样做

self.ContentList[i].ChangeLabel_ListText(['a','b','c','d','e','f'])

您的第 i-th ContentList-条目将被更改。

完整的解决方案如下:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.lang import Builder
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
from kivy.uix.button import Button
from kivy.app import runTouchApp

class AddContent(GridLayout):
    #response = requests.get("http://localhost:10010/")
    # Get the response data as a python object.  Verify that it's a dictionary.
    #data = response.json()[3]
    #Column_keys = ["country", "date", "answered_calls", "total_calls", "asr", "mou", "aou"]
    def __init__(self, **kwargs):
        super(AddContent, self).__init__(**kwargs)
        self.RowList = []
        self.Label_List = []
        self.length = 0

    def AddRow(self, InputList):
        self.RowList = InputList
        self.length = len(InputList)

    def AddLabel(self,LayoutObj):
        lbl = Label(size_hint_y=None, height=30)
        LayoutObj.add_widget(lbl)
        return lbl

    def AddLabelRow(self,LayoutObj):
        for i in range(self.length):
            Lbl = self.AddLabel(LayoutObj)
            Lbl.text = "empty"
            #self.Label_List[i].text = data[Column_keys[i]]
            #Lbl.text = str(self.data[self.Column_keys[i]])
            self.Label_List.append(Lbl)

    def ChangeLabel_ListText(self, TextList):
        for i in range(self.length):
            #self.Label_List[i].text = data[Column_keys[i]] #data is fetched from Db
            self.Label_List[i].text  = TextList[i]



class TableView(GridLayout):
    Col_Names = ["Date","Vendor","Country","MOU","ASR","AOU"]
    ContentList = [AddContent(),AddContent(),AddContent()]
    def __init__(self,**kwargs):
        self.layout  = GridLayout(cols = len(self.Col_Names), padding=5)
        self.layout.bind(minimum_height=self.layout.setter('height'))
        for i in range(len(self.Col_Names)):
            btn = Button(text=self.Col_Names[i], size_hint_y=None, height=30)
            self.layout.add_widget(btn)

        self.ContentList[0].AddRow(['1sample1','1sample2','1sample3','1sample4','1sample5','1sample6'])
        self.ContentList[1].AddRow(['2sample1','2sample2','2sample3','2sample4','2sample5','2sample6'])
        self.ContentList[2].AddRow(['3sample1','3sample2','3sample3','3sample4','3sample5','3sample6'])

        for i in range(3):
            self.ContentList[i].AddLabelRow(self.layout)

        self.ContentList[2].ChangeLabel_ListText(['a','b','c','d','e','f'])

if __name__ == '__main__':
    Table = TableView()
    runTouchApp(Table.layout)