我正在尝试向具有子菜单的gtk.MenuItem添加全局快捷方式。
这是我的代码:
import pygtk, gtk
import keybinder
dlg = gtk.Dialog('menu test')
dlg.set_size_request(200, 40)
menubar = gtk.MenuBar()
menubar.show()
menuitem = gtk.MenuItem('foo')
menuitem.show()
menubar.append(menuitem)
mitem = gtk.MenuItem('bar')
mitem.show()
menu = gtk.Menu()
menu.add(mitem)
menu.show()
menuitem.set_submenu(menu)
def show_menu_cb():
menubar.select_item(menuitem)
keybinder.bind('<Super>i', show_menu_cb)
dlg.vbox.pack_start(menubar)
dlg.show()
dlg.run()
当我按下弹出的键菜单时,我可以在子菜单中选择项目或按Esc使其消失。 但之后,menuitem保持选中状态,其他窗口永远不会再次获得输入焦点。我必须两次点击menuitem才能恢复正常。
答案 0 :(得分:1)
我想出来了。 MenuShell.select_item将使指定的menuitem抓住焦点,但在menuitem内部选择完成后,必须明确取消键盘和鼠标焦点。所以代码看起来像:
def on_done(w, *args):
gtk.gdk.keyboard_ungrab()
gtk.gdk.pointer_ungrab()
def show_menu_cb():
menubar.connect('cancel', on_done)
menubar.connect('selection-done', on_done)
menubar.select_item(menuitem)