KivyMD中添加MDDataTable时出现TypeError报错如何解决
报错排查与解决步骤
你碰到的TypeError: object.init() takes exactly one argument报错,结合你复用2020年旧帖子代码的场景,核心原因集中在版本不匹配、导入缺失、参数不兼容三类,按优先级逐个排查即可解决:
一、优先排查依赖版本不兼容问题
- 你参考的旧帖子对应的kivy、kivymd版本是2020年的老版本,现在pip默认安装的新版库对MDDataTable的底层RecycleView实现做了大幅修改,跨版本直接复用旧代码,非常容易出现父类初始化参数不匹配的问题。
- 先在终端执行命令查看当前安装的版本:
pip list | grep -E "kivy|kivymd"- 如果查到kivy版本>=2.2.0,搭配的kivymd版本<1.1.1,肯定会触发这个报错:老版本kivymd内部调用布局初始化时传了已被新版kivy废弃的参数,直接导致
__init__方法收到多余参数抛出异常。
- 如果查到kivy版本>=2.2.0,搭配的kivymd版本<1.1.1,肯定会触发这个报错:老版本kivymd内部调用布局初始化时传了已被新版kivy废弃的参数,直接导致
- 修复操作:
- 卸载现有不匹配的版本:
pip uninstall kivy kivymd -y - 安装官方验证过的兼容组合:先执行
pip install "kivy[base]>=2.1.0",再执行pip install kivymd==1.2.0,这个版本组合下MDDataTable的所有初始化参数和底层实现完全匹配,不会触发布局初始化冲突。
- 卸载现有不匹配的版本:
二、检查导入语句是否完整
- 很多初学者写代码时只导入用到的MDDataTable,漏了依赖的基础组件导入,也会在类初始化时触发父类引用错误,进而抛出参数不匹配的异常。
- 你的代码文件头部必须补充完整导入:
注意不要从旧路径from kivymd.app import MDApp from kivymd.uix.datatables import MDDataTable from kivy.metrics import dp from kivy.uix.screen import Screenkivymd.uix.card或者老版本路径导入MDDataTable,路径错误会加载到内部依赖缺失的旧类,直接触发初始化报错。
三、核对传参格式与取值兼容性
- 你代码里写的
orientation="lr-tb"参数,在旧版MDDataTable中是有效配置,但在1.1.0以上的新版本中,这个参数会被透传给底层的RecycleLayout,而新版RecycleLayout对orientation的取值规则做了调整,传值不匹配就会触发初始化异常。 - 再核对row_data的格式要求:MDDataTable要求row_data的每一个元素,必须是和column_data长度完全一致的元组。你当前写的
row_data=[("Burger", "300"), ("Oats", "50")]结构本身是符合要求的,注意不要在值里嵌套复杂结构,避免初始化时递归传参出错。 - 调整后可直接运行的build方法参考:
这里去掉了易引发版本冲突的orientation参数,补充了新版MDDataTable默认要求的check参数,避免初始化时缺省参数不匹配。def build(self): screen = Screen() table = MDDataTable( pos_hint={'center_x': 0.5, 'center_y': 0.5}, size_hint=(0.9, 0.6), check=False, column_data=[ ("Food", dp(30)), ("Calories", dp(30)) ], row_data=[ ("Burger", "300"), ("Oats", "50") ] ) screen.add_widget(table) return screen
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

