2014-03-28 13 views
0

我正在學習如何在編寫args_converter函數的同時在小部件中構建自定義ListView項目。我的問題很簡單:我建立了一個自定義的BoxLayout的一些特性:Kivy args_converter函數:試圖用kwargs生成ListView項目後的'ValueError'

class CountyItem(BoxLayout): 
    background = ObjectProperty 
    name_gui = StringProperty 
    protocol_gui = StringProperty 
    quantity_gui = NumericProperty 
    unit_gui = NumericProperty 
    budget_gui = NumericProperty 

然後,我創建了一個小部件(另一BoxLayout的)與一個ListView作爲OBJECTPROPERTY(這裏的complete code):

class CountyView(BoxLayout): 
    county_list_view = ObjectProperty() 

    def __init__(self): 
     super(CountyView, self).__init__() 
     print("CountyView created!") 
     self.county_list_view.adapter.data = ["Municipio1", "Municipio2", "Municipio3", "Municipio4"] 
     print("ListAdapter created!") 

    def county_converter(self, index, datakey): 
     print("In county_converter....") 
     print("datakey:"+ str(datakey)) 
     print("index:"+ str(index)) 
     app = ConsManage.get_running_app() 

     result = {} 

     if index % 2: 
      result['background'] = (0, 0, 0, 1) 
     else: 
      result['background'] = (0.05, 0.05, 0.07, 1) 

     result['name_gui'] = datakey 
     result['protocol_gui'] = app.data[datakey]['protocol'] 
     result['quantity_gui'] = app.data[datakey]['quantity'] 
     result['unit_gui'] = app.data[datakey]['unit'] 
     result['budget_gui'] = app.data[datakey]['budget'] 
     print("result = " + str(result)) 

     return result 

在我Kivy文件,我定義這兩個部件的定製,與ListAdapter的定義 爲CountyItem部件一起:

#:import listadpt kivy.adapters.listadapter 
#:import mydata __main__ 

CountyView: 

<CountyView>: 
    orientation: 'vertical' 
    size_hint_y: None 
    county_list_view: list_view 
    ListView: 
     id:list_view 
     adapter: 
      listadpt.ListAdapter(data=[], 
      cls=mydata.CountyItem, 
      args_converter=root.county_converter) 

<CountyItem>: 
    size_hint_y: None 
    canvas.before: 
     Color: 
      #rgba: self.background 
      rgba: (0, 0, 0, 1) 
     Rectangle: 
      pos: self.pos 
      size: self.size  
    BoxLayout: 
     size_hint_x: 2 
     orientation: 'vertical' 
     Label: 
      text: root.name_gui 
      color: (0.6, 0.6, 0.7, 1.0) 
      font_size: "15dp" 
      size_hint_y: 0.45 
     BoxLayout: 
      size_hint_y: 0.55 
      orientation: 'horizontal' 
      Label: 
       text: root.protocol_gui 
       color: (0.5, 0.5, 0.5, 1.0) 
       font_size: "13dp" 
       size_hint_x: 0.3 
      Label: 
       text: str(root.quantity_gui) 
       color: (0.5, 0.5, 0.5, 1.0) 
       font_size: "13dp" 
       size_hint_x: 0.1 
      Label: 
       text: str(root.unit_gui) 
       color: (0.5, 0.5, 0.5, 1.0) 
       font_size: "13dp" 
       size_hint_x: 0.2 
      Label: 
       text: str(root.budget_gui) 
       color: (0.5, 0.5, 0.5, 1.0) 
       font_size: "13dp" 
       size_hint_x: 0.2 

當我運行代碼時,我檢查了county_converter的「結果」是否正確地分配給CountyItem項目的每個kwargs。結果如下:

result = {'protocol_gui': '00000001', 'budget_gui': 1000000, 'quantity_gui': 100, 'background': (0.05, 0.05, 0.07, 1), 'unit_gui': 10000, 'name_gui': 'Municipio1'}

然而,一旦被創建的窗口將關閉,並顯示如下消息:

ValueError: Label.text accept only str

完整的執行和回溯是here

無論如何,有什麼可能導致這個問題?我應該採取哪些措施來糾正此問題?

回答

1

bionoid剛剛離開irc後指出了答案;你的屬性被聲明爲錯誤的。您需要使用(例如)background = ObjectProperty()實例化該屬性。

這解釋了你的錯誤;標籤的文本被設置爲指向ObjectProperty(如在基類中),而不是它期望的字符串。

+0

謝謝。我在IRC看到他的回答,並正確糾正。我會補充說我的kv文件生成的窗口很醜,所以如果有人測試它,他們應該刪除CountyView和CountyItem中的「size_hint_y:None」規則,因爲它顯示佈局不合適。 – chicao