2017-04-20 6 views
0

[Kivy 1.9.2-dev0 사용] 기본적으로 Kivy와 네트워크 드로잉 도구를 사용하고 있습니다. 지금은 사용자가 네트워크를 모델화하기위한 항목을 추가 할 수 있도록 노력하고 있습니다.Kivy - 함수 바인딩에서 'self'인수가 누락되었습니다.

우선 가장 먼저 노드에 그림을 추가하려고합니다. 그렇게하기 위해, 나는 다른 종류의 아이템을 인스턴스화 할 수있는 모든 버튼을 포함 할 ButtonPanel 클래스를 만들었습니다.

그런 다음 추가 할 항목마다 다른 종류의 팝업을 만들었습니다. 다음은 "노드 추가"GUI 코드입니다. 여기서 NodePopup 클래스를 볼 수 있습니다. "노드 추가"버튼을 클릭 할 때마다 NodePopup 인스턴스가 생성됩니다. 이 클래스의 "checkbox_changed"함수는 내가 문제를 해결할 수있는 곳이다.

CustomPopup 클래스는 KV 파일을로드하는 기본 클래스이며 모든 사용자 지정 팝업은이 클래스에서 상속되므로 여러 번 쓸 필요가 없습니다.

또한 "Checkbox_changed"기능을 호출 할 때마다 Checkbox의 상태가 변경 될 때마다 호출되는 "toggle_form"이라는 데코레이터를 추가했습니다.

그러나, 나는 체크 박스, 프로그램 충돌을 클릭하고 나는 다음과 같은 오류 얻을 때 나는이 오류가 왜 내가 가진 함수를 호출하고 같이

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 (관련 부분) :

enter image description here

: 여기
<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 만 사용해야한다는 뜻입니까?

답변

0

좋아, 알겠습니다. 이 오류는 그냥 다른 오류가 발생할

return self.func() 

에 편집 ... 데코레이터에 있었다, 그러나 나는 나 자신에 의해 그것을 알아낼 수 있습니다.