2011-06-26 18 views
10

sto cercando di portare alcuni piccoli esempi da PyGTK ai nuovi collegamenti PyGobject, ma i miei hanno colpito un roadblock con un popupmenu, nonostante non abbia ricevuto errori, nessun menu viene mostrato su rightclick, ecco il codice ,Gtk.StatusIcon PopupMenu in 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() 

Suppongo che il problema è im non dire il menu su self.statusicon in là, ma doesnt lavoro in una qualsiasi delle args poiché tutti vogliono un widget arg o nessuno, non uno statusicon, qualsiasi intelligente ppl qui ha avuto un'idea di dove sto andando storto?

+0

Non vedo nemmeno 'StatusIcon.position_menu' nella documentazione di' Gtk.StatusIcon'. Vedo ['gtk.status_icon_position_menu'] (http://www.pygtk.org/docs/pygtk/class-gtkstatusicon.html#function-gtk--status-icon-position-menu), che accetta chiaramente un' StatusIcon '. Non funziona più? (Domanda correlata: sei [Hairy_Palms] (http://ubuntuforums.org/showthread.php?t=1789358)? Non devi rispondere a questo.) – senderle

+0

StatusIcon.position_menu è il nuovo modo di introspezione gtk3 di chiamare gtk .status_icon_position_menu, che si lamenta se provo a dargli uno statusicon come ho fatto per il vecchio metodo. (Risposta correlata: Sì :)) – Mike

+0

@Mike, ok, scusa. È passato un po 'di tempo da quando usavo pygtk ... Immagino che il mio approccio sarebbe scrivere la mia funzione di posizionamento che accetti un 'StatusIcon', chiama [' StatusIcon.get_geometry() '] (http: //www.pygtk. org/docs/pygtk/class-gtkstatusicon.html # method-gtkstatusicon - get-geometry), e restituisce un ['(x, y, push_in)'] (http://www.pygtk.org/docs/pygtk /class-gtkmenu.html#method-gtkmenu--popup) tupla. Ma questo è un WAG e presuppone che queste funzioni non siano cambiate. (A proposito, la firma 'menu.popup' è veramente cambiata, come suggerisce il codice? Sembra una seria rottura dell'API se è così.) – senderle

risposta

16

ah finalmente, se qualcun altro ha questo problema, è stato risolto grazie ad un aiuto fantastico da uno dei ragazzi su gimpnet # python che hai avuto modo di mantenere il tuo menu in scope o si ottiene garbage collection quindi nessun errore ma nessun menu o questo è il codice di lavoro

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

Non funziona. :( – Erigami

+1

sembra che alcune cose siano cambiate in pygobject, la funzione pos ora riceve solo due argomenti dall'evento, metto una risposta aggiornata a http://pastebin.com/Rzek336p poiché stackoverflow sembra avvitare anche il rientro – Mike

+0

codice inline per modificare il tuo pastebin. Sembra che tu stia usando un mix di schede e spazi, il che potrebbe essere il motivo per cui SO stava intasando la tua formattazione –

0

copia Mike's solution dall'alto con alcune pulizie minori e correzioni per nuova 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() 

(esitare aggiornare se i cambiamenti gtk di nuovo)

Problemi correlati