Python中的Gtk.StatusIcon弹出菜单
我正在尝试把一些小例子从PyGTK移植到新的PyGobject绑定,但在使用弹出菜单时遇到了麻烦。虽然没有错误提示,但右键点击时菜单就是不显示。以下是我的代码:
from gi.repository import Gtk
class aStatusIcon:
def __init__(self):
self.statusicon = Gtk.StatusIcon()
self.statusicon.set_from_stock(Gtk.STOCK_HOME)
self.statusicon.connect("popup-menu", self.right_click_event)
window = Gtk.Window()
window.connect("destroy", lambda w: Gtk.main_quit())
window.show_all()
def right_click_event(self, icon, button, time):
menu = Gtk.Menu()
about = Gtk.MenuItem()
about.set_label("About")
quit = Gtk.MenuItem()
quit.set_label("Quit")
about.connect("activate", self.show_about_dialog)
quit.connect("activate", Gtk.main_quit)
menu.append(about)
menu.append(quit)
menu.show_all()
#menu.popup(None, None, gtk.status_icon_position_menu, button, time, self.statusicon) # previous working pygtk line
menu.popup(None, None, None, Gtk.StatusIcon.position_menu, button, time) #i assume this is problem line
def show_about_dialog(self, widget):
about_dialog = Gtk.AboutDialog()
about_dialog.set_destroy_with_parent(True)
about_dialog.set_name("StatusIcon Example")
about_dialog.set_version("1.0")
about_dialog.set_authors(["Andrew Steele"])
about_dialog.run()
about_dialog.destroy()
aStatusIcon()
Gtk.main()
我猜问题出在我没有在菜单里告诉它关于self.statusicon的事情,但在任何参数中都不行,因为它们都需要一个小部件参数或者什么都不需要,而不是statusicon。这里有没有聪明的人能告诉我我哪里出错了?
2 个回答
0
这里是对上面Mike的解决方案的复制,做了一些小的清理和修正,以适应更新后的gtk3:
#!/usr/bin/python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MyStatusIconApp:
def __init__(self):
self.status_icon = Gtk.StatusIcon()
self.status_icon.set_from_stock(Gtk.STOCK_HOME)
self.status_icon.connect("popup-menu", self.right_click_event)
def right_click_event(self, icon, button, time):
self.menu = Gtk.Menu()
about = Gtk.MenuItem()
about.set_label("About")
about.connect("activate", self.show_about_dialog)
self.menu.append(about)
quit = Gtk.MenuItem()
quit.set_label("Quit")
quit.connect("activate", Gtk.main_quit)
self.menu.append(quit)
self.menu.show_all()
self.menu.popup(None, None, None, self.status_icon, button, time)
def show_about_dialog(self, widget):
about_dialog = Gtk.AboutDialog()
about_dialog.set_destroy_with_parent(True)
about_dialog.set_name("StatusIcon Example")
about_dialog.set_version("1.0")
about_dialog.set_authors(["Andrew Steele"])
about_dialog.run()
about_dialog.destroy()
app = MyStatusIconApp()
Gtk.main()
(如果gtk再次更新,欢迎随时更新这个内容)
16
啊,终于解决了!如果还有其他人遇到这个问题,感谢gimpnet#python的一个朋友的帮助。你必须确保你的菜单在作用范围内,否则它会被垃圾回收掉,这样就不会报错,但菜单也会消失。这是可以正常工作的代码。
from gi.repository import Gtk
class aStatusIcon:
def __init__(self):
self.statusicon = Gtk.StatusIcon()
self.statusicon.set_from_stock(Gtk.STOCK_HOME)
self.statusicon.connect("popup-menu", self.right_click_event)
window = Gtk.Window()
window.connect("destroy", lambda w: Gtk.main_quit())
window.show_all()
def right_click_event(self, icon, button, time):
self.menu = Gtk.Menu()
about = Gtk.MenuItem()
about.set_label("About")
quit = Gtk.MenuItem()
quit.set_label("Quit")
about.connect("activate", self.show_about_dialog)
quit.connect("activate", Gtk.main_quit)
self.menu.append(about)
self.menu.append(quit)
self.menu.show_all()
def pos(menu, icon):
return (Gtk.StatusIcon.position_menu(menu, icon))
self.menu.popup(None, None, pos, self.statusicon, button, time)
def show_about_dialog(self, widget):
about_dialog = Gtk.AboutDialog()
about_dialog.set_destroy_with_parent(True)
about_dialog.set_name("StatusIcon Example")
about_dialog.set_version("1.0")
about_dialog.set_authors(["Andrew Steele"])
about_dialog.run()
about_dialog.destroy()
aStatusIcon()
Gtk.main()