Python Gtk3右键菜单

时间:2014-02-22 20:45:04

标签: python gtk gobject

我正在尝试在python / gtk3中创建一个弹出菜单。到目前为止,我已经尝试了以下代码:

from gi.repository import Gtk
def show_menu(self, *args):     
    menu = Gtk.Menu()
    i1 = Gtk.MenuItem("Item 1")
    menu.append(i1)
    i2 = Gtk.MenuItem("Item 2")
    menu.append(i2)
    i2.show()    
    i1.show()
    menu.popup(None, None, None, None, 0, Gtk.get_current_event_time())
    print("Done")


window = Gtk.Window() 
button = Gtk.Button("Create pop-up") 
button.connect("clicked", show_menu) 
window.add(button) 
window.show_all()
Gtk.main()

但弹出菜单没有出现?我做错了什么?

2 个答案:

答案 0 :(得分:5)

由于menushow_menu()函数中的局部变量,并且它没有被其他任何东西引用,因此它的引用计数降为0并且在函数结束时被销毁;不幸的是,当你期待看到它时,这是正确的。

相反,在全局范围内创建menu,使得menu不再是一个函数的本地,因此它不会在函数结束时被销毁。 / p>

from gi.repository import Gtk

def show_menu(self, *args):
    i1 = Gtk.MenuItem("Item 1")
    menu.append(i1)
    i2 = Gtk.MenuItem("Item 2")
    menu.append(i2)
    menu.show_all()
    menu.popup(None, None, None, None, 0, Gtk.get_current_event_time())
    print("Done")

window = Gtk.Window()
button = Gtk.Button("Create pop-up")
menu = Gtk.Menu()
button.connect("clicked", show_menu)
window.connect('destroy', Gtk.main_quit)
window.add(button)
window.show_all()
Gtk.main()

答案 1 :(得分:1)

在回调中,执行menu.attach_to_widget (widget, None)。而不是* args也可以更简单地为回调提供正确的参数,我相信在这种情况下只是`show_menu(self,widget,user_data)'。

attach_to_widget基本上将菜单的责任传递给GtkWindow,包括所有清理,定位等。

相关问题