如何以编程方式选择MenuItem

0 投票
1 回答
565 浏览
提问于 2025-04-16 05:46

我正在尝试给一个有子菜单的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键让菜单消失。但是在这之后,菜单项会一直保持选中状态,其他窗口就再也无法获得输入焦点了。我必须点击这个菜单项两次才能让一切恢复正常。

1 个回答

1

我搞明白了。MenuShell.select_item这个函数会让你选中的菜单项获得焦点,但在你完成菜单项的选择后,需要明确地把键盘和鼠标的焦点释放掉。所以代码看起来是这样的:

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)

撰写回答