2011-06-26 74 views
10

即时通讯尝试将PyGTK中的一些小例子移植到新的PyGobject绑定中,但是,即使没有错误,我仍然用popupmenu命中了一个障碍,没有菜单显示在右键点击,这里是代码,Gtk.StatusIcon PopupMenu 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): 
     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,任何智能ppl在这里有一个想法,我会出错吗?

+0

我甚至没有在'Gtk.StatusIcon'的文档中看到'StatusIcon.position_menu'。我看到['gtk.status_icon_position_menu'](http://www.pygtk.org/docs/pygtk/class-gtkstatusicon.html#function-gtk--status-icon-position-menu),它清楚地接受了一个'StatusIcon '。这是不是工作了? (相关问题:你是[Hairy_Palms](http://ubuntuforums.org/showthread.php?t=1789358)?你不需要回答这个问题。) – senderle

+0

StatusIcon.position_menu是新的调用gtk3的gtk3内省方式.status_icon_position_menu,其中抱怨,如果我尝试并给它一个状态图像我为旧方法做的方式。 (相关答案:是的:)) – Mike

+0

@Mike,好的,对不起。自从我使用pygtk以来已经有一段时间了......我想我的方法是编写自己的定位函数来接受一个'StatusIcon',调用['StatusIcon.get_geometry()'](http://www.pygtk。 org/docs/pygtk/class-gtkstatusicon.html#method-gtkstatusicon - get-geometry),并返回['(x,y,push_in)'](http://www.pygtk.org/docs/pygtk /class-gtkmenu.html#method-gtkmenu--popup)元组。但这是一个WAG,并假设这些功能没有改变。 (顺便说一句,有'menu.popup'签名真的改变了,因为你的代码建议?这似乎是一些严重的API损坏,如果是这样的。) – senderle

回答

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() 
+0

它不起作用。 :( – Erigami

+1

似乎有些事情已经在pygobject中发生了变化,pos函数现在只接收来自事件的两个参数,生病在http://pastebin.com/Rzek336p提出了一个更新的答案,因为stackoverflow似乎也拧紧了缩进 – Mike

+0

我编辑了内联代码来修改你的pastebin,看起来你可能一直在使用tab和spaces的混合,这可能是为什么SO会搞乱你的格式 –

0

复制Mike's solution从上面有一些小的清理和修复更新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变化)