Kivy房屋应用add_widget参数缺失错误及MySQL数据展示问题
问题描述
开发简易房屋租赁移动端应用,已实现MySQL数据插入功能,但在show_records函数中遍历数据库查询结果并尝试将内容添加到MDCard组件时,出现如下错误:
line 127, in show_records self.root.get_screen('single').ids.card_load.add_widget( TypeError: add_widget() missing 1 required positional argument: 'widget'
需解决该错误,实现数据库数据在MDCard中的正确展示。
错误原因
add_widget调用方式错误:add_widget()仅需直接传入目标Widget实例,代码中使用label=关键字参数的写法,导致方法未接收到必填的widget参数。- 布局与数据展示逻辑冲突:当前KV文件中
card_load是单个固定结构的MDCard,直接往其中添加Label会破坏原有布局;同时循环中反复给同一个rental标签赋值,最终仅能显示最后一条数据的内容。
解决方案
1. 修复add_widget调用错误
将错误的调用代码:
self.root.get_screen('single').ids.card_load.add_widget( label=MDLabel(text='safe space') )
修改为直接传入Widget实例:
self.root.get_screen('single').ids.card_load.add_widget( MDLabel(text='safe space') )
2. 调整布局与展示逻辑(支持多条记录展示)
若要展示所有数据库记录,需让GridLayout动态生成对应数量的MDCard,每条记录对应一个独立卡片:
修改single.kv布局文件
移除GridLayout内部的固定MDCard,让GridLayout作为卡片容器:
MDScreen: name: "single" ScrollView: MDFloatLayout: md_bg_color:1,1,1,1 MDIconButton: icon:"arrow-left" pos_hint:{"center_y":.95} user_font_size:"30sp" theme_text_color:"Custom" text_color:rgba(26,24,58,255) on_release: root.manager.transition.direction= "right" root.manager.current="login" MDGridLayout: rows: None # 自动适配内容行数 cols:1 adaptive_height: True spacing: "10dp" padding: "10dp" id:grid # 用于动态添加卡片的容器
修改show_records函数逻辑
为每条数据库记录创建独立MDCard,并填充对应数据:
def show_records(self): screen_manager.current = "single" # 清空容器,避免重复加载旧数据 grid = self.root.get_screen('single').ids.grid grid.clear_widgets() mydb = mysql.connector.connect( host="localhost", user="root", passwd="password123", database="housing_details" ) c = mydb.cursor() c.execute('SELECT * FROM test_two') myresults = c.fetchall() for record in myresults: # 创建单条记录的卡片 card = MDCard( radius=25, size_hint_y=None, height="450", padding="20dp", md_bg_color=(1,1,1,1) ) # 构建卡片内部垂直布局 main_layout = MDBoxLayout(orientation="vertical") # 添加房源图片 img = Image(size_hint_y=None, height="200", pos_hint={"center_y":.7}) img.source = record[2] # 数据库中存储的是文件路径 main_layout.add_widget(img) # 构建信息横向布局 info_layout = MDBoxLayout(orientation="horizontal") # 左侧标签列 label_col = MDBoxLayout(orientation="vertical") label_col.add_widget(MDLabel(text="RENTAL")) label_col.add_widget(MDLabel(text="LOCATION:")) label_col.add_widget(MDLabel(text="PRICE:")) label_col.add_widget(MDLabel(text="CONTACT:")) info_layout.add_widget(label_col) # 右侧内容列 content_col = MDBoxLayout(orientation="vertical") content_col.add_widget(MDLabel(text=record[0])) content_col.add_widget(MDLabel(text=record[1])) content_col.add_widget(MDLabel(text=str(record[3]))) # INT转字符串 content_col.add_widget(MDLabel(text=str(record[4]))) # INT转字符串 info_layout.add_widget(content_col) main_layout.add_widget(info_layout) # 添加更多信息 main_layout.add_widget(MDLabel(text=record[5])) card.add_widget(main_layout) grid.add_widget(card) mydb.close()
额外优化提示
- 查询数据库无需调用
commit(),仅在修改数据(插入/更新/删除)时需要。 - 数据库中
price和cont_info为INT类型,取出后需转为字符串才能在MDLabel中正常显示。 - 每次加载记录前清空GridLayout,避免重复展示旧数据。
内容的提问来源于stack exchange,提问作者berryl otieno
相关产品推荐
相关产品推荐

