我正在研究如何在小部件中构建自定义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。
无论如何,可能导致这个问题的原因是什么?我应该采取哪些措施来纠正这个问题?
答案 0 :(得分:1)
background = ObjectProperty()
实例化该属性。
这解释了你的错误;标签的文本设置为指向ObjectProperty(如基类),而不是它所期望的字符串。