保存信号处理程序返回的变量?

时间:2012-11-17 21:56:52

标签: python textview pygtk gtktreeview signal-handling

我正在使用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 个答案:

答案 0 :(得分:0)

返回值的信号处理程序没有意义,将其返回到哪里?

信号处理程序应该是一个类的方法,将值存储为属性,即:

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__方法声明值属性
  • self.selection_changed()的连接方法更改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)
    ...

但我认为第一个是标准方法。