You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中的正确展示。

错误原因
  1. add_widget调用方式错误:add_widget()仅需直接传入目标Widget实例,代码中使用label=关键字参数的写法,导致方法未接收到必填的widget参数。
  2. 布局与数据展示逻辑冲突:当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:54:59