2010-10-20 123 views
0

我想添加一个全局快捷方式到一个gtk.MenuItem它有一个子菜单。如何以编程方式选择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保持选定状态,其他窗口再也不会获得输入焦点。我必须点击菜单项两次才能恢复正常。

+0

答案在下面的框中输入。 – 2010-12-30 04:38:10

+0

完成。我只是不确定我是否应该回答我自己的问题:) – Shaung 2010-12-30 04:45:47

回答

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) 
相关问题