【问题标题】:Kivy - missing 'self' argument on function bindingKivy - 缺少函数绑定的“自我”参数
【发布时间】:2017-04-20 09:36:07
【问题描述】:

[使用 Kivy 1.9.2-dev0] 基本上,我正在使用 Kivy 开发网络绘图工具。现在我正在尝试让用户添加项目来对网络进行建模。

首先,我主要想在我的绘图中添加一些节点。为此,我创建了一个 ButtonPanel 类,其中包含允许我们实例化不同类型项目的每个按钮。

然后,我为要添加的每个项目创建了不同类型的弹出窗口。这是“添加节点”GUI 的代码。在这里,我们可以看到 NodePopup 类。每次单击“添加节点”按钮时,都会创建一个 NodePopup 实例。这个类的函数“checkbox_changed”是我的问题所在。

CustomPopup 类是一个将加载 KV 文件的基类,我所有的 Custom Popup 都将继承自它,因此我不必多次编写它。

我还添加了一个装饰器“toggle_form”,每次复选框的状态发生变化时都会调用它(因此,每次我们调用“checkbox_changed”函数时)。

但是,当我单击复选框时,程序崩溃并出现以下错误:

TypeError: checkbox_changed() 缺少 1 个必需的位置参数: '自己'

我真的不明白为什么会出现此错误,因为我正在使用 root 关键字调用函数,据我所知,它指的是根小部件的实例,在这种情况下,“NodePopup”类的一个实例。

为什么我会收到此类型错误?我该如何解决?

buttonpanel.py:

class ButtonPanel(GridLayout):
    btn_layout = ObjectProperty(None)
    node_btn = ObjectProperty(None)
    build = BooleanProperty(False)

# This method will create a Popup containing a form, allowing us to put some info about the node we want to add.
def create_node(self):
    content = NodePopup(cancel=self.cancel)
    self._popup = Popup(title="Add a Node", content=content, size_hint=(0.2, 0.5))
    if self.build is False:
        self._popup.open()


class CustomPopup(BoxLayout):
    Builder.load_file(os.path.join(dirname(__file__), 'popups.kv'))


class NodePopup(CustomPopup):
    cancel = ObjectProperty(None)
    slack_mode = BooleanProperty(False)
    form = ObjectProperty(None)
    slack_chkbox = ObjectProperty(None)

    # Function called everytime we click on a checkbox
    @toggle_form
    def checkbox_changed(self):
        if not self.slack_mode:
            print("POPUPS.PY\\CHECKBOX_CHANGED CALL\\", self.slack_mode)
            self.ids['form'].dismissed = False
        else:
            self.ids['form'].dismissed = True

# Decorator
def toggle_form(func):
    def wrapper(self, *args, **kwargs):
        if self.slack_chkbox.active:
            self.slack_mode = False
        else:
            self.slack_mode = True
        return func()
    return wrapper

popups.kv(相关部分):

<NodePopup>:
    form: form
    slack_chkbox: slack_chkbox
    size: root.size
    pos: root.pos
    orientation: "vertical"
    GridLayout:
        cols: 2
        size_hint: [1, .1]
        Label:
            text: "Slack Node"
        CheckBox:
            id: slack_chkbox
            active: False
            on_release: root.checkbox_changed()

这是有问题的(基本)NodePopup 的图像:

附注: 我已经有另一个使用 Popups 的类,我用它来加载文件。但是当我加载一个网络时,我使用了一个静态函数,我没有收到任何错误,网络已加载,一切似乎都工作正常。这是否意味着当我想将函数绑定到 Popup 的孩子时,我只能使用 @staticmethod

【问题讨论】:

    标签: kivy python-3.6 kivy-language


    【解决方案1】:

    好的,我明白了。错误在装饰器中...刚刚编辑为

    return self.func()
    

    这会导致另一个错误,但我可以自己解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多