Kivy自定义子类传递额外kwargs触发TypeError如何解决?
问题解决方法
错误原因
你传入的workout_title、last_completed、lifts三个自定义参数没有在子类初始化时提前提取,全部被传入父类GridLayout的初始化方法,父类本身不支持这三个参数,参数沿继承链向上传递到object.__init__时触发参数校验报错。
修正后的代码
首先修改SelectionBanner类的初始化逻辑:
class SelectionBanner(GridLayout): def __init__(self, **kwargs) -> None: # 提前提取自定义参数,从kwargs中移除后再传给父类 self.workout_title = kwargs.pop('workout_title', '默认训练标题') self.last_completed = kwargs.pop('last_completed', '暂无记录') self.lifts = kwargs.pop('lifts', '暂无动作') # 剩余参数都是父类支持的参数,正常传入 super().__init__(**kwargs) grid = GridLayout( rows = 3, size_hint = (.8,1) ) workout_title_label = Label( size_hint = (1,.33), pos_hint = {"top": 1, "left": .5}, # 替换为实例存储的自定义参数 text = self.workout_title ) last_completed_label = Label( size_hint = (1,.33), pos_hint = {"top": 1, "left": .5}, text = self.last_completed ) lifts_label = Label( size_hint = (1,.33), pos_hint = {"top": 1, "left": .5}, text = self.lifts ) button = Button( size_hint = (.2, 1), text = "Click me!" ) grid.add_widget(workout_title_label) grid.add_widget(last_completed_label) grid.add_widget(lifts_label) self.add_widget(grid) self.add_widget(button)
build_selection_page方法不需要修改,原有传参逻辑可以正常使用。
核心逻辑说明
kwargs.pop(key, 默认值)会从关键字参数字典中取出对应参数并删除该键,保证传入父类的kwargs只包含父类支持的参数- 取出的自定义参数会存储为实例属性,可以在类内部任意位置调用
- 第二个参数为默认值,不传对应自定义参数时也不会报错
内容的提问来源于stack exchange,提问作者awhitin2
相关产品推荐
相关产品推荐

