2011-06-26 9 views
10

पीजीजीटीके से कुछ छोटे उदाहरणों को नए पायगोबजेक्ट बाइंडिंग में बंद करने की कोशिश कर रहा है, लेकिन आईपी ने पॉपअपमेनू के साथ रोडब्लॉक मारा है, कोई त्रुटि नहीं होने के बावजूद, राइटक्लिक पर कोई मेनू नहीं दिखाया जा रहा है, यहां कोड है ,पायथन

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

मैं मान समस्या im है वहाँ में self.statusicon के बारे में मेनू नहीं बता रही है, लेकिन यह आर्ग में से किसी में काम नहीं करता, क्योंकि वे सब एक विजेट आर्ग या बिल्कुल भी नहीं है, न कि statusicon चाहते हैं, किसी भी स्मार्ट पीपीएल को यहां एक विचार आया जहां मैं गलत हो रहा हूं?

+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 स्वीकार करता है '। क्या यह अब काम नहीं करता है? (संबंधित प्रश्न: क्या आप [हैरी_Palms] (http://ubuntuforums.org/showthread.php?t=1789358)? आपको इसका उत्तर देने की आवश्यकता नहीं है।) – senderle

+0

StatusIcon.position_menu gtk को कॉल करने का नया gtk3 आत्मनिरीक्षण तरीका है .status_icon_position_menu, जो शिकायत करता है अगर मैं कोशिश करता हूं और इसे पुरानी विधि के लिए एक statusicon देता हूं। (संबंधित उत्तर: हाँ :)) – Mike

+0

@ माइक, ठीक है, क्षमा करें। यह थोड़ी देर के बाद से मैंने pygtk का उपयोग किया है ... मुझे लगता है कि मेरा दृष्टिकोण मेरे स्वयं के पोजीशनिंग फ़ंक्शन को लिखना होगा जो 'StatusIcon' स्वीकार करेगा, ['StatusIcon.get_geometry()'] (http: //www.pygtk। संगठन/दस्तावेज़/pygtk/class-gtkstatusicon.html # विधि-gtkstatusicon - get-geometry), और एक ['(x, y, push_in)'] (http://www.pygtk.org/docs/pygtk) /class-gtkmenu.html#method-gtkmenu--popup) tuple। लेकिन यह एक डब्ल्यूएजी है, और मानता है कि ये कार्य नहीं बदले हैं। (बीटीडब्लू, क्या आपके कोड से पता चलता है कि 'menu.popup' हस्ताक्षर वास्तव में बदल गया है? ऐसा लगता है कि ऐसा कुछ गंभीर एपीआई टूटना है।) – senderle

उत्तर

16

आह अंत में, अगर किसी और को यह समस्या है, तो यह हल हो गया है कि लोगों में से किसी एक से गिंपनेट # पायथन पर कुछ भयानक मदद के लिए धन्यवाद, आपको अपने मेनू को दायरे में रखना होगा या कचरा इकट्ठा हो जाता है इसलिए कोई त्रुटि नहीं, लेकिन कोई मेनू नहीं या तो इस काम के कोड

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 function अब घटना से दो तर्क प्राप्त करता है, बीमार ने http://pastebin.com/Rzek336p पर एक अद्यतन उत्तर दिया है क्योंकि स्टैक ओवरफ्लो इंडेंटेशन को भी पेंच लग रहा है – Mike

+0

मैंने संपादित किया आपके पेस्टबिन को संशोधित करने के लिए इनलाइन कोड। ऐसा लगता है कि आप टैब और रिक्त स्थान के मिश्रण का उपयोग कर रहे हैं, हो सकता है कि एसओ क्यों आपके स्वरूपण को गड़बड़ कर रहा था। –

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

(अद्यतन करने के लिए स्वतंत्र महसूस अगर फिर जीटीके परिवर्तन)