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())

但当然它不起作用。

4

1 回答 1

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__方法声明值属性
  • 在 connect 方法更改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)
    ...

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

于 2012-11-17T22:14:58.380 回答