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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:54:02