如何将Kivy文件中Spinner的id与产品数据库数据绑定并解决ids访问报错
问题原因
- KV文件中id定义错误:Kivy的id属性不需要加引号,加引号会导致ids字典无法正确识别
- 调用时机错误:Screen的
__init__方法执行时,KV规则还未完成渲染,ids字典尚未生成,此时访问ids必然报错 - 不必要的多继承:Screen本身已经继承自Widget类,重复继承Widget/FloatLayout会导致逻辑冲突
- 未加载KV规则:若你的KV代码未保存为与App类同名的kv文件(
buendes.kv),则需要手动加载KV内容
修复步骤
1. 修正KV文件的id定义
去掉所有id属性的双引号,修改后对应部分代码如下:
<SecondWindow>: name: "cotiza" FloatLayout: CodigoSpin: id: Cod_prod pos: 20, 100 Label: text: "Descripcion" pos: 20, 35 CodigoSpin: id: Cod_prod2 pos: 20, 200 Label: text: "Descripcion" pos: 20, 130 CodigoSpin: id: Cod_prod3 pos: 20, 300 Label: text: "Descripcion" pos: 20, 235
2. 修正SecondWindow的逻辑
去掉多余继承,把初始化Spinner的逻辑放到on_enter方法中,该方法会在切换到SecondWindow时自动执行,此时ids已经完成加载:
# 仅继承Screen即可,无需额外继承Widget class SecondWindow(Screen): listcode = ListProperty([]) def __init__(self, **kwargs): super(SecondWindow, self).__init__(**kwargs) # 数据库操作可以保留在__init__里提前加载数据 conn = sqlite3.connect("inventingt.db") cursor = conn.cursor() cursor.execute("""SELECT Codigo FROM masterinv """) rows = cursor.fetchall() self.listcode = [str(t[0]) for t in rows] conn.close() # 操作完成后关闭数据库连接 # 重写on_enter方法,进入页面前给Spinner赋值 def on_enter(self, *args): self.ids.Cod_prod.values = self.listcode # 其余Spinner也可在此处完成赋值 # self.ids.Cod_prod2.values = xxx
3. 确保KV规则正确加载
两种方案二选一即可:
- 把KV代码保存为
buendes.kv,和主程序放在同一目录下,Kivy会自动加载同名KV文件 - 在主程序开头引入Builder手动加载KV字符串,示例:
from kivy.lang import Builder # 把你的全部KV代码放在下方三引号中 KV = ''' <WindowManager>: FirstWindow: SecondWindow: # 剩余KV内容 ''' Builder.load_string(KV)
4. 修复其余多余继承问题
# 去掉多余的FloatLayout继承 class FirstWindow(Screen): pass # 去掉多余的Widget继承 class WindowManager(ScreenManager): pass
内容的提问来源于stack exchange,提问作者Luis R
相关产品推荐
相关产品推荐

