我正在尝试将一些小例子从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,但是在任何参数中都不起作用,因为它们都需要一个widget参数或none,而不是statusicon。这里有聪明的人能想出我哪里错了吗?
Gtk.StatusIcon
的文档中甚至都找不到StatusIcon.position_menu
。我看到了gtk.status_icon_position_menu
,它明确接受一个StatusIcon
参数。这个方法不再可用吗?(相关问题:你是Hairy_Palms吗?你不必回答。) - senderleStatusIcon
,调用StatusIcon.get_geometry()
,并返回一个(x, y, push_in)
元组。但这只是猜测,并假设这些函数没有改变。(顺便问一下,你的代码中menu.popup
的签名真的改变了吗?如果是这样,那似乎是一些严重的API破坏。) - senderleself.popup_for_device(None, parent_menu_shell, parent_menu_item, func, data, button, activate_time)
与旧的self.popup(parent_menu_shell, parent_menu_item, func, button, activate_time, data=None)
相比,或者至少它说它是,这就是问题所在:(因为参数似乎不符合参考文献所述的内容。 - Mike