无法动态更新Kivy标签文本

时间:2017-01-28 20:09:15

标签: python-2.7 class label kivy kivy-language

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

  • AddRow - 添加将成为其中文本的字符串列表 标签。
  • AddLabel - 向该行添加标签并附加标签列表
  • AddLabelRow - 在实际表格中创建列表行 将文本初始化为“空”
  • ChangeLableText - 获取字符串的输入列表,并更改该类标签中的字符串。

然后我为这个类初始化了一个对象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'])行 只更新第一行,无论索引的编号是多少。

过去一周,我一直在打破这个问题。我最初只使用一个类而不是两个产生相同输出的类。 任何帮助都会有很大帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

    self.length = 0

如果你现在这样做

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

您的i - 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)