【问题标题】:__init__ method missing positional argument even though it is clearly passed__init__ 方法缺少位置参数,即使它已明确传递
【发布时间】:2022-01-01 22:15:43
【问题描述】:

我在 kivy 中有一个自定义小部件 PlaylistView,它应该将另一个自定义小部件作为其 init 方法的参数:

class PlaylistView(Widget):
    def __init__(self, node, **kwargs):  # (originally:) node: GridNode,...  (custom node, removed for min. reproducable exmple but still yields the same error)
        super().__init__(**kwargs)
        self.node = node
        ...

但每当我尝试创建它的实例时,例如:PlaylistView(1)PlaylistView(GridNode('test'))PlaylistView("test")(无论我作为参数传递什么),我都会收到以下错误:

 Traceback (most recent call last):
   File "C:/Users/Maximilian.Wolf/PycharmProjects/MiaudioPyler/main.py", line 215, in <module>
     PlaylistView("test")
   File "C:/Users/Maximilian.Wolf/PycharmProjects/MiaudioPyler/main.py", line 157, in __init__
     super().__init__(**kwargs)
   File "C:\Users\Maximilian.Wolf\Miniconda3\envs\MiaudioPyler\lib\site-packages\kivy\uix\widget.py", line 359, in __init__
     self.apply_class_lang_rules(
   File "C:\Users\Maximilian.Wolf\Miniconda3\envs\MiaudioPyler\lib\site-packages\kivy\uix\widget.py", line 463, in apply_class_lang_rules
     Builder.apply(
   File "C:\Users\Maximilian.Wolf\Miniconda3\envs\MiaudioPyler\lib\site-packages\kivy\lang\builder.py", line 541, in apply
     self._apply_rule(
   File "C:\Users\Maximilian.Wolf\Miniconda3\envs\MiaudioPyler\lib\site-packages\kivy\lang\builder.py", line 663, in _apply_rule
     self._apply_rule(
   File "C:\Users\Maximilian.Wolf\Miniconda3\envs\MiaudioPyler\lib\site-packages\kivy\lang\builder.py", line 659, in _apply_rule
     child = cls(__no_builder=True)
 TypeError: __init__() missing 1 required positional argument: 'node'

我也尝试在 init 中使用node=None,结果相同。

这可能与 kivy 或我如何称呼 super().__init__ 有关吗?
编辑
我单独尝试了这个,它有效,仍然不知道是什么导致了错误。

from kivy.uix.widget import Widget

class PlaylistView(Widget):
    def __init__(self, node, **kwargs):
        super().__init__(**kwargs)
        self.node = node

PlaylistView(1)

编辑 2 更多信息: 我在示例中所做但未显示的是使用Builder.load_file(.. 加载一堆kv 文件。将其注释掉也会使错误消失。

【问题讨论】:

  • 您是否尝试过使用super().__init__(node, **kwargs)
  • 是的,但这是一个意外的论点。我不想将它传递给 Widget 类,它的构造函数没有那个参数,所以如果我这样做,我会得到:TypeError: __init__() takes 1 positional argument but 2 were given
  • 您未向我们展示的代码有问题。我们不知道是什么,因为你没有给我们看。发布minimal reproducible example
  • 原码和第一次编辑有什么区别?我没看到。
  • 编辑 2 中的代码在编辑 1 中丢失。

标签: python kivy initialization arguments init


【解决方案1】:

必须从上到下读取回溯。错误是文件“C:\Users\Maximilian.Wolf\Miniconda3\envs\MiaudioPyler\lib\site-packages\kivy\lang\builder.py”,第 659 行。 线

child = cls(__no_builder=True)

正在触发错误。由于 kivy 使用工厂,因此不清楚是什么导致了错误,但该参数在该调用中丢失,并且 not 在您对 super().__init__ 的调用中。

您还应该在签名中包含*args 并调用super:工厂可以使用函数签名。

【讨论】:

  • *args 没有帮助。但是正如你所说的错误是由不同的东西引起的,另一个类在它不应该有的时候有'node'作为参数。我通过查看 Builder 引发错误时正在处理的类来找出错误所在。
【解决方案2】:

尝试做:

def __init__(self, node): 
        super(Widget, self).__init__()

【讨论】:

  • 这只是通过在原始错误之上堆积另一个错误来隐藏错误。 super(Widget, self).__init__() skips Widget.__init__ - super 的第一个参数是要跳过的类,而不是应该找到方法的类。
  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2023-03-22
  • 2021-09-15
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 2021-02-08
  • 2020-06-13
  • 2021-07-25
相关资源
最近更新 更多