我有这个代码:
import pymysql
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
db = pymysql.connect("host", "user", "password", "database")
cursor = db.cursor()
cursor.execute("SELECT phone_info FROM ants WHERE id='onexT1'")
data_list = cursor.fetchall()
hello = list(data_list)
class ViewButton(Button):
def print_data(self, data):
print(data)
KV = '''
<ViewButton>:
on_release:
root.print_data(self.data)
RecycleView:
data: ()
viewclass: 'ViewButton'
RecycleBoxLayout:
default_size_hint: 1, None
orientation: 'vertical'
'''
class Test(App):
def build(self):
root = Builder.load_string(KV)
root.data = (item for item in hello)
return root
if __name__ == '__main__':
Test().run()
基本上,数据库中查询的结果存储为元组。但是当我运行它时,它会返回一个错误:
AttributeError: 'tuple' object has no attribute 'get'
所以我尝试将元组转换为列表,但它返回与上面相同的错误。
我想要的是使用recycleview在表格中显示元组/列表的内容。谢谢 :)
RecycleView需要一个哈希表的迭代,例如字典列表,其中字典的键是将在视图类中使用的属性,这在docs中指出:
数据:
当前视图适配器使用的数据。这是一个dicts列表,其键映射到视图类的相应属性名称。
data是一个AliasProperty,用于获取和设置用于生成视图的数据。
fetchall返回一个元组列表,我们必须将该元组列表转换为字典列表,其中字典键是“text”,因为它是ViewButton使用的属性。
另一方面,ViewButton没有data属性而是text,因此您必须保存该信息。
...
data_list = cursor.fetchall()
hello = [({"text": result[0]}) for result in data_list] # convert
class ViewButton(Button):
def print_data(self, data):
print(data)
KV = '''
<ViewButton>:
on_release:
root.print_data(self.text) # <---
RecycleView:
viewclass: 'ViewButton'
RecycleBoxLayout:
default_size_hint: 1, None
orientation: 'vertical'
'''
class Test(App):
def build(self):
root = Builder.load_string(KV)
root.data = hello
return root
if __name__ == '__main__':
Test().run()