我正在使用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())
但当然不起作用。
答案 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)
...
但我认为第一个是标准方法。