2011-06-26 45 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變化)