在PyGTK中,我有一个Entry和一个TreeView。当聚焦TreeView时,关键事件(Up,Down,PageUp,PageDown)以某种方式在视图中移动选择。我想在Entry聚焦时拦截这些关键事件,并将它们重定向到TreeView,以便像TreeView聚焦一样移动选择。
我可以拦截Entry上的按键事件并确定它是否适用于我需要的键,但是我将它传递给TreeView时遇到了麻烦。
# In UI initialization
self.name_entry = gtk.Entry(max=0)
self.name_entry.connect('key-press-event', self.on_key_press)
store = self.create_store() # a simple ListStore is created here
view = gtk.TreeView(store)
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Name", rendererText, text=0)
column.set_sort_column_id(0)
view.append_column(column)
self.tree_view = view
# ...
def on_key_press(self, widget, event):
if event.keyval == UP:
self.tree_view.do_something() # ???
return True
# etc. for other keyvals
有没有办法让tree_view处理事件,好像在焦点被按下时键被按下了?
(注意:该程序是一个hack;我不关心PyGTK开发的最佳实践。)
感谢任何帮助。
答案 0 :(得分:3)
这样的事情应该有效:
def on_key_press(self, widget, event):
if gtk.gdk.keyval_name(event.keyval) in ("Up", "Down", "Page_Up", "Page_Down"):
self.tree_view.grab_focus()
self.tree_view.emit('key_press_event', event)
self.name_entry.grab_focus()