无法将 kwargs 传递给 Kivy 中的子类——TypeError: object.__init__() 只采用一个参数(要初始化的实例)

Posted

技术标签:

【中文标题】无法将 kwargs 传递给 Kivy 中的子类——TypeError: object.__init__() 只采用一个参数(要初始化的实例)【英文标题】:Can't pass kwargs to sub class in Kivy -- TypeError: object.__init__() takes exactly one argument (the instance to initialize) 【发布时间】:2021-12-24 08:50:45 【问题描述】:

我对编程很陌生,如果这里的解决方案很明显,请原谅我。我已经进行了相当多的谷歌搜索,但无法解决这个问题。 我正在尝试使子类能够接受基类可以接受的任何关键字参数,以及我想传递的一些附加参数,但我一直遇到以下错误:TypeError: object.init() 只接受一个参数(要初始化的实例)。

如果我注释掉未内置在基类中的关键字参数(workout_title、last_completed 和 lifts),代码运行没有问题。

我如何让子类接受我的额外 kwargs?

class SelectionBanner(GridLayout):
    def __init__(self, **kwargs) -> None:
        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 = "workout tile"
            )
        last_completed_label = Label(
            size_hint = (1,.33), 
            pos_hint = "top": 1, "left": .5, 
            text = "last_completed"
            )
        lifts_label = Label(
            size_hint = (1,.33), 
            pos_hint = "top": 1, "left": .5, 
            text = "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)

def build_selection_page(self):
    data = db.reference("/workout_templates").get()
    selection_page = self.root.ids['home_screen'].ids['top_layout']
    selection_page.add_widget(SelectionBanner(
        cols = 2, 
        padding = 10, 
        spacing = 10, 
        pos_hint = "top": 1, "left": .5, 
        size_hint = (1, .2),
        workout_title = "Workout B",
        last_completed = "Yesterday",
        lifts = "Bench and stuff"
        ))



【问题讨论】:

请发布完整的回溯。如果大多数代码对于错误来说不是必需的,请创建一个没有它的测试文件。轻松复制和运行您的代码。 “如果我注释掉未内置在基类中的关键字参数(workout_title、last_completed 和 lifts),代码运行没有问题。” 是什么意思?您是否使用这样的参数实例化该类? tdelaney,感谢您对有效问题发布的反馈。这是我的第一篇文章,所以这是对前进的有用反馈。下面约翰安德森的建议解决了我的问题,但为了回答您的问题,我正在实例化该类,如 build_selection_page 函数中所示。完成最后三个参数(我添加的未由基类处理的 kwargs)后,它会引发类型错误。但是,如果我删除了这些论点,它就可以正常工作了。 知道了。当我尝试复制时,我一定没有复制足够多的代码。 【参考方案1】:

只需为新的关键字参数添加Properties,如下所示:

class SelectionBanner(GridLayout):
    workout_title = StringProperty('')
    last_completed = StringProperty('')
    lifts = StringProperty('')

    def __init__(self, **kwargs) -> None:
        super().__init__(**kwargs)
    .
    .
    .

【讨论】:

以上是关于无法将 kwargs 传递给 Kivy 中的子类——TypeError: object.__init__() 只采用一个参数(要初始化的实例)的主要内容,如果未能解决你的问题,请参考以下文章

Kivy popup Filechooser传递变量(选择)

Kivy 将变量传递给类中的函数

将 kwargs 传递给 Django 过滤器

将文本从文本输入传递到 Kivy 中的标签

如何将 kwargs 传递给 boost-python 包装函数?

按下时将动态创建的按钮信息传递给函数。 kivymd, kivy, 蟒蛇