2017-04-20 23 views
0

[Kivy 1.9.2-dev0の使用] 基本的に、私はKivyでネットワーク描画ツールを使っています。今私はユーザーにネットワークをモデル化するための項目を追加させようとしています。Kivy - 関数バインディングで 'self'引数がありません

まず最初に、私は主に私の図にいくつかのノードを追加したいと思います。これを行うために、私はButtonPanelクラスを作成しました。クラスButtonPanelには、さまざまな種類のアイテムをインスタンス化できるすべてのボタンが含まれています。

次に、追加したいアイテムごとに異なる種類のポップアップを作成しました。以下は「ノードの追加」GUIのコードです。ここで、NodePopupクラスを見ることができます。 NodePopupのインスタンスは、「Add Node」ボタンをクリックするたびに作成されます。このクラスの "checkbox_changed"関数は私の問題をどこから得るかです。

クラスCustomPopupはKVファイルを読み込む基本クラスであり、私のカスタムポップアップはすべてそれを継承するため、複数回書く必要はありません。

デコレータ "toggle_form"も追加されました。これは、チェックボックスの状態が変更されるたびに呼び出されます(したがって、 "checkbox_changed"関数を呼び出すたびに呼び出されます)。私は、チェックボックスをクリックしたとき

はしかし、プログラムがクラッシュし、私は次のエラーを取得:

TypeError: checkbox_changed() missing 1 required positional argument: 'self'

を私は関数を呼び出していますように私は、このエラーが出るんなぜ私は本当に理解していません私が知る限り、ルートウィジェットのインスタンス(この場合は "NodePopup"クラスのインスタンス)を参照するrootキーワードです。

なぜこのタイプエラーが発生しますか?どうすれば解決できますか?

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の画像です:

enter image description here

PS: 私は既にファイルを読み込むために私が使用するポップアップを使用して別のクラスがあります。しかし、私はネットワークを読み込むときに私は静的関数を使用し、私はエラーが発生し、ネットワークがロードされ、すべて正常に動作するようです。私はポップアップの子に関数をバインドするときに@staticmethodだけを使わなければならないのですか?

答えて

0

[OK]を取得します。エラーはデコレータにありました...ただ編集しました

return self.func() 

これは別のエラーにつながりますが、私はそれを自分で理解することができます。

関連する問題