无法将 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传递变量(选择)