2017-04-20 48 views
0

[使用Kivy 1.9.2-裝置0] 基本上,我的工作與Kivy網絡繪圖工具。現在我正在嘗試讓用戶添加項目以對網絡進行建模。第一Kivy - 在功能結合失蹤「自我」的說法

第一件事,我主要是希望將一些節點添加到我的畫。爲此,我創建了一個ButtonPanel類,它將包含每個允許我們實例化不同類型項目的按鈕。

然後,我創建了一個別樣的彈出窗口的每個項目我會想補充。這是「添加節點」GUI的代碼。在這裏,我們可以看到NodePopup類。每次單擊「添加節點」按鈕時都會創建一個NodePopup實例。這個類的函數「checkbox_changed」是我從中得到我的問題的地方。

類CustomPopup是一個基類,將加載KV文件,以及我所有的自定義彈出窗口將繼承它,所以我不會有好幾次寫。

我還添加了裝飾「toggle_form」,這將被稱爲每次複選框的狀態已經改變(因此,每次我們稱之爲「checkbox_changed」功能)。

然而,當我點擊複選框,程序崩潰,並且我收到以下錯誤:

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

我真的不明白,爲什麼我得到這個錯誤,因爲我呼籲與功能關鍵字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有問題的圖像:

enter image description here

PS: 我已經有另一個使用Popups的類來加載文件。但是當我加載一個網絡時,我使用了一個靜態函數,並且我沒有遇到任何錯誤,網絡被加載並且一切看起來都很好。這是否意味着當我想將功能綁定到Popup的孩子時,我只需要使用@staticmethod

回答

0

好吧,我明白了。錯誤是在裝飾...只要編輯以

return self.func() 

從而導致另一個錯誤,但我可以通過自己看着辦吧。