如何以编程方式选择菜单项

时间:2010-10-20 06:22:51

标签: python gtk pygtk

我正在尝试向具有子菜单的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才能恢复正常。

1 个答案:

答案 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)