Kivy Python3报错:'super'对象无'__getattr__'及KeyError:'container'
解决MDDataTable的KeyError: 'container'和AttributeError问题
错误原因
- row_data格式不合法:MDDataTable要求
row_data的每个元素是与列数匹配的元组。你当前的row_data中,('data1')不是元组(只是字符串,正确单元素元组需写成('data1',)),且3列的表格每行必须提供3个值才能完成列映射,格式错误会触发内部渲染异常。 - 子类未正确初始化父类:继承
MDDataTable后,你没有调用父类的__init__方法,导致MDDataTable内部的container等核心组件未被创建,进而引发KeyError和后续的AttributeError。
解决方案
以下两种方式任选其一即可:
方式一:直接使用MDDataTable实例(无需自定义子类)
修改Python代码和kv文件,直接传入格式正确的参数:
Python代码:
from kivymd.app import MDApp from kivy.lang import Builder class app(MDApp): def build(self): return Builder.load_file('lab.kv') app().run()
kv文件(lab.kv):
BoxLayout: MDDataTable: id: datatable column_data: [('col1', dp(30)), ('col2', dp(30)), ('col3', dp(30))] row_data: [ ('data1', 'data2', 'data3'), ('data4', 'data5', 'data6'), ('data7', 'data8', 'data9') ]
方式二:正确自定义MDDataTable子类
若需保留自定义子类,必须在子类的__init__中调用父类初始化方法,并传入合法参数:
Python代码:
from kivymd.app import MDApp from kivy.lang import Builder from kivymd.uix.datatables import MDDataTable from kivy.metrics import dp class Datatable(MDDataTable): def __init__(self, **kwargs): column_data = [('col1', dp(30)), ('col2', dp(30)), ('col3', dp(30))] row_data = [ ('data1', 'data2', 'data3'), ('data4', 'data5', 'data6'), ('data7', 'data8', 'data9') ] # 调用父类初始化,传入必要参数 super().__init__(column_data=column_data, row_data=row_data, **kwargs) class app(MDApp): def build(self): return Builder.load_file('lab.kv') app().run()
kv文件保持不变:
BoxLayout: Datatable: id:datatable
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

