Kivy args_converter 函数:构建 ListView 项目时出现 'ValueError
我正在学习如何在一个小部件中构建自定义的列表视图项,同时编写一个叫做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(也就是基类),而不是它所期望的字符串。