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