2012-11-17 73 views
0

我正在使用PyGTK 2編寫Python 2.7中的應用程序。基本上我創建了TreeView小部件,用內容填充它,然後檢查選擇是否更改。如果它是真的,我希望選擇在TextView框中打印。我的想法是獲得選定的價值,更新文本和刷新小部件。這裏是我得到的選擇值:保存信號處理程序返回的變量?

定義:

class SomeClass: 
    def __init__(self): 
     ... 
     someTextView = build_textview("some text") 
     ... 
     tree_selection = someTreeView.get_child().get_selection() 
     tree_selection.connect("changed", self.selection_changed()) 
     ... 

    # Signal handler: 
    def selection_changed(self, widget, data=None): 
     (model, pathlist) = widget.get_selected_rows() 
     for path in pathlist : 
      tree_iter = model.get_iter(path) 
      value = model.get_value(tree_iter,0) 
      return value 

正如你看到的,selection_changed處理程序返回值。問題是如何在處理程序被調用後保存該值?我知道我可以使用全局變量或類屬性,但它不是一個選項。我希望代碼看起來整潔。即:

tree_selection.connect("changed", value=self.selection_changed()) 

但當然它不起作用。

回答

1

它沒有任何意義的信號處理程序返回值,返回它在哪裏?

信號處理程序應該是一個類的方法,其中,是有意義的值存儲爲一個屬性,即:

class SomeClass: 
    def __init__(self): 
     self.value = None 
     ... 
     someTextView = build_textview("some text") 
     ... 
     tree_selection = someTreeView.get_child().get_selection() 
     tree_selection.connect("changed", self.selection_changed) 
     ... 

    def selection_changed(self, widget, data=None): 
     (model, pathlist) = widget.get_selected_rows() 
     for path in pathlist : 
      tree_iter = model.get_iter(path) 
      value = model.get_value(tree_iter,0) 
      this.value = value 
      return 

注:

  • __init__方法聲明值屬性
  • in connect method change self.selection_changed() for self.selection_changed所以你傳遞方法本身而不是方法的結果。
  • selection_changed方法將值存儲在屬性中並不返回任何內容。

希望它有幫助。

更新

如果你還覺得你的代碼看起來更好,如果它明確地顯示了它的存儲值,你可以做這樣的事情:

def __init__(self): 
    self.value = None 
    ... 
    someTextView = build_textview("some text") 
    ... 
    def selection_changed_handler(widget, data): 
     value = self.selection_changed(widget, data) 

    tree_selection = someTreeView.get_child().get_selection() 
    tree_selection.connect("changed", selection_changed_handler) 
    ... 

但我第一個想到的是標準方法。

+0

嗯,其實我知道它可以這樣做,但問題是如果和如何可以存儲變量**信號手柄返回**?我將編輯該問題以避免誤解。 – Sayid

+0

您不能存儲返回值。您正在註冊一個函數,以便在選擇更改時由TreeView對象調用,以便您的處理程序將值返回給TreeView對象中不關心返回值的方法。 – pmoleri