【问题标题】:Can't pass kwargs to sub class in Kivy -- TypeError: object.__init__() takes exactly one argument (the instance to initialize)无法将 kwargs 传递给 Kivy 中的子类——TypeError: object.__init__() 只采用一个参数(要初始化的实例)
【发布时间】: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)后,它会引发类型错误。但是,如果我删除了这些论点,它就可以正常工作了。
  • 知道了。当我尝试复制时,我一定没有复制足够多的代码。

标签: python kivy subclass init


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2021-09-15
    • 2021-12-19
    • 2019-12-31
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多