Kivy args_converter 函数:构建 ListView 项目时出现 'ValueError

0 投票
1 回答
1331 浏览
提问于 2025-04-18 00:19

我正在学习如何在一个小部件中构建自定义的列表视图项,同时编写一个叫做args_converter的函数。我的问题很简单:我创建了一个自定义的BoxLayout,并设置了一些属性:

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

然后我又创建了一个小部件(另一个BoxLayout),里面有一个作为ObjectProperty的ListView(这是完整代码):

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 只接受字符串

完整的执行过程和回溯信息在这里

总之,这个问题可能是什么原因造成的?我应该采取什么措施来解决这个问题?

1 个回答

1

bionoid 在你离开 IRC 后指出了答案;你的属性声明得不对。你需要用 (例如) background = ObjectProperty() 来实例化这个属性。

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

撰写回答