2011-06-26 34 views
10

PyGTK'den yeni PyGobject bağlantılarına bazı küçük örnekleri aktarmaya çalışıyorum, ancak hatalara rağmen bir popupmenu ile birlikte bir roadblock'a bastım, rightclick'te hiçbir menü gösterilmiyor, işte buradaki kod , Python'da Gtk.StatusIcon PopupMenu

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

i sorun orada self.statusicon hakkında menüyü söylemiyor im olduğunu varsayalım, ama hepsi bir widget arg veya hiçbiri değil, bir STATUSICON istiyorum çünkü, args hiçbirinde akıllı doesnt iş ppl burada yanlış giden bir fikrim var mı?

+0

'StatusIcon.position_menu',' Gtk.StatusIcon' belgesinde bile göremiyorum. Ben açıkça bir 'StatusIcon kabul [' gtk.status_icon_position_menu'] (http://www.pygtk.org/docs/pygtk/class-gtkstatusicon.html#function-gtk--status-icon-position-menu), görüyorum '. Bu artık işe yaramıyor mu? (İlgili soru: sen [Hairy_Palms] (http://ubuntuforums.org/showthread.php?t=1789358)? Sen buna cevap vermek zorunda değilsin.) – senderle

+0

StatusIcon.position_menu, gtk3'ün yeni gtk3 içgözleme yoludur. .status_icon_position_menu, eski yöntem için yaptığım gibi bir statusicon denemek ve denemek eğer şikayetçi. (İlgili Cevap: Evet :)) – Mike

+0

@Mike, tamam, üzgünüm. Pygtk'i kullandığımdan beri bir süre geçti ... Sanırım benim yaklaşımım, bir 'StatusIcon' kabul edecek kendi konumlandırma işlevimi yazmak, [StatusIcon.get_geometry() '] (http: //www.pygtk. org/docs/pygtk/class-gtkstatusicon.html # method-gtkstatusicon - get-geometri) ve bir ['(x, y, push_in)'] döndürün (http://www.pygtk.org/docs/pygtk /class-gtkmenu.html#method-gtkmenu--popup) tuple. Ama bu bir WAG, ve bu işlevlerin değişmediğini varsayar. (BTW, 'menü.popup' imzası, kodunuz önerdiği gibi gerçekten değişti mi? Bu, eğer bazı ciddi API kırılması gibi görünüyor.) – senderle

cevap

16

ah nihayet, eğer bu sorunu başka birine sahipse, gimpnet # python'daki birinden harika bir yardım aldığınız için teşekkür ederiz, menünüzün menzilini korumak zorundasınız ya da toplanan çöpleri alır, ancak hiçbir menü yok ya bu yukarıdan yeni gtk3 için bazı küçük temizlikleri ve düzeltmelerle çalışma kodu

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

Çalışmıyor. :( – Erigami

+1

bazı şeyler pygobject değişti görünüyor, pos işlevi artık sadece olaydan iki argüman alır, hasta stackoverflow beri http://pastebin.com/Rzek336p de güncelleştirilmiş cevabı koymak ben düzenlenebilir – Mike

+0

çok girinti vida gibi görünüyor macununuzu değiştirmek için satır içi kod.Çok sekmeleri ve boşlukları bir arada kullanıyor olabilirsiniz, bu yüzden neden biçimlendirmenizi bozuyor olabilirsiniz –

0

Kopyalama Mike's solution geçerli:

#!/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() 

(güncellemek için çekinmeyin tekrar gtk değişiklikleri)