![](/img/trans.png)
[英]Store and call event handler in Tkinter (for treeview's selection handler)
[英]TreeView Selection Handler triggering twice
我试图在PyGTK中显示一棵对象树,以便当您单击一个对象时,它将移动到上一个空间,然后将其子对象呈现在原处。
例如,如果我们从选定的对象1开始,将显示其子对象。
| Level 1 | Level 2 |
| ->Object 1<- | Object 1 Child 1 |
| Object 2 | Object 1 Child 2 |
| Object 3 | Object 1 Child 3 |
如果我们随后选择其子级之一,则将显示其子级。
| Level 1 | Level 2 |
| ->Object 1 Child 1<- | Object 1 Child 1 Child 1 |
| Object 1 Child 2 | Object 1 Child 1 Child 2 |
| Object 1 Child 3 | Object 1 Child 1 Child 3 |
因此,我们只是遍历数据树。 我曾与实现了这个PyGTK.TreeView
的连接PyGTK.ListStore
的持有对象的显示值,然后实际的对象本身的另一个列表。
我有方法可以侦听PyGTK.TreeViewSelection
changed
事件,以重新呈现数据。
问题是,当我重建ListStore
,对于新对象,该事件被击中两次,而我不知道为什么。
仅仅吃掉第一个或第二个事件似乎不起作用,因为偶尔会触发一个事件。
以下是一些工作示例代码,它们说明了正在发生的事情以及我正在尝试做的事情:
#!/usr/bin/python3
import gi
gi.require_version('Gtk','3.0')
gi.require_version('WebKit2','4.0')
from gi.repository import Gtk, WebKit2, Gdk
class TmpWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_position(Gtk.WindowPosition.CENTER)
self.connect('delete-event', Gtk.main_quit)
self.outerBox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL,spacing=6)
self.add(self.outerBox)
self.urlGrid = Gtk.Grid()
self.urlGrid.set_column_homogeneous(True)
self.urlGrid.set_row_homogeneous(True)
self.outerBox.pack_start(self.urlGrid,False,False,10)
# Set the starting lists
self.node0List = ['Object']
self.node0GridList = Gtk.ListStore(str)
self.node0GridList.append(['ObjectString'])
self.node1List = ['Object2', 'Object3']
self.node1GridList = Gtk.ListStore(str)
[self.node1GridList.append([child]) for child in self.node1List]
self.treeView0 = Gtk.TreeView.new_with_model(self.node0GridList)
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn('Node0',renderer, text=0)
self.treeView0.append_column(column)
self.scrollable_treelist0 = Gtk.ScrolledWindow()
self.scrollable_treelist0.add(self.treeView0)
self.urlGrid.attach(self.scrollable_treelist0, 0 ,0,200,10)
self.treeView1 = Gtk.TreeView.new_with_model(self.node1GridList)
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn('Node1',renderer, text=0)
self.treeView1.append_column(column)
self.scrollable_treelist1 = Gtk.ScrolledWindow()
self.scrollable_treelist1.add(self.treeView1)
self.urlGrid.attach_next_to(self.scrollable_treelist1,self.scrollable_treelist0,Gtk.PositionType.RIGHT, 200,10)
self.treeView0SignalId = self.treeView0.get_selection().connect('changed',self.node0Selection)
self.treeView1SignalId = self.treeView1.get_selection().connect('changed',self.node1Selection)
self.show_all()
def node0Selection(self, selection):
print('Hitting Node0 Selection Handler')
self.treeView0.get_selection().handler_block(self.treeView0SignalId)
self.treeView1.get_selection().handler_block(self.treeView1SignalId)
tmp = self.node0List
self.node0List = self.node1List
self.node1List = tmp
self.node0GridList.clear()
[self.node0GridList.append([child]) for child in self.node0List]
self.node1GridList.clear()
[self.node1GridList.append([child]) for child in self.node1List]
self.treeView0.get_selection().handler_unblock(self.treeView0SignalId)
self.treeView1.get_selection().handler_unblock(self.treeView1SignalId)
def node1Selection(self, selection):
print('Hitting Node1 Selection Handler')
self.treeView0.get_selection().handler_block(self.treeView0SignalId)
self.treeView1.get_selection().handler_block(self.treeView1SignalId)
tmp = self.node0List
self.node0List = self.node1List
self.node1List = tmp
self.node0GridList.clear()
[self.node0GridList.append([child]) for child in self.node0List]
self.node1GridList.clear()
[self.node1GridList.append([child]) for child in self.node1List]
self.treeView0.get_selection().handler_unblock(self.treeView0SignalId)
self.treeView1.get_selection().handler_unblock(self.treeView1SignalId)
if __name__ == '__main__':
TmpWindow()
Gtk.main()
单击列表中的任何项目时,单击处理程序时,控制台中都会显示一条消息。 请注意,单击鼠标连续将它们击中两次。
我最终通过将单击处理程序放在tree_view row-activated
事件上来解决此问题。 而不是选择更改的事件。
self.tree_views[0].connect('row-activated',self.node_one_selection)
我仍然会接受一个答案,说明为什么我必须这样做(很好奇我在思考GTK小部件时的缺点是/过去)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.