Kivy args_converter函数:' ValueError'在尝试使用kwargs构建ListView项目之后

时间:2014-03-28 12:46:06

标签: python listview kivy

我正在研究如何在小部件中构建自定义ListView项目以及编写args_converter函数。我的问题很简单:我构建了一个带有一些属性的自定义BoxLayout:

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文件中,我定义了两个小部件的自定义以及定义 为CountyItem小部件添加ListAdapter:

#: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的'result'是否正确地分配了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 个答案:

答案 0 :(得分:1)

bionoid在你离开irc之后指出了答案;您的属性声明错误。您需要使用(例如)background = ObjectProperty()实例化该属性。

这解释了你的错误;标签的文本设置为指向ObjectProperty(如基类),而不是它所期望的字符串。