2017-01-28 2 views
0

GUI와 같은 테이블에 행을 추가하려고합니다. 이 행은 레이블 목록입니다. 업데이트됩니다 각 행은 그 클래스에서 다음과 같은 방법이 있습니다동적 업데이트 Kivy 레이블 텍스트를 사용할 수 없습니다.

  • 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']) 업데이트 인덱스에 대해 주어진 어떤 수의 첫 번째 행입니다.

저는 지난 주 동안 내 머리를 아프게했습니다. 처음에 같은 출력을내는 클래스 대신에 하나의 클래스로이 작업을 수행했습니다. 도움이 될 것입니다. 감사!

+0

내 대답은 문제를 해결하는 데 도움이 되었습니까 : 여기

는 완벽한 솔루션입니다? 그렇지 않다면 알려주세요. 그렇다면 허용 된 것으로 표시하십시오. – yogabonito

+0

답변 해 주셔서 감사합니다. 그것은 작동합니다. – FaultyProgrammer3107

답변

1

첫 번째 문제점은 RowList, Label_List 및 크기가 코드에 클래스 속성입니다. 하지만 각각 인스턴스에 개별적으로 설정하려고합니다. 해결 방법 :이 같은 __init__ 방법 내부의 이러한 특성을 초기화 :

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

두 번째 문제는, (클래스는 서브 클래스 됨) GridLayoutsize이라는 속성이 포함되어있다. 해결 방법 :과 같이이 속성에 대해 다른 이름을 선택 :

self.length = 0 

당신은 지금 당신의 i 번째 ContentList -entry이 변경됩니다

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

을합니다.

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) 
관련 문제