2015-11-22 28 views
6

Sto assemblando una GUI usando PyGObject. Questo codice Python funziona nel contesto. Ottengo un pulsante della barra degli strumenti con l'icona "Apri" di serie.Qual è il modo non deprecato di visualizzare un'icona stock in GTK3?

from gi.repository import Gtk 

# ... 

toolbar = Gtk.Toolbar() 
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) 

# ... 

self.fileOpen = Gtk.ToolButton.new_from_stock(Gtk.STOCK_OPEN) 
self.fileOpen.connect("clicked", self.on_FileOpenStandard_activate) 
toolbar.insert(self.fileOpen, -1) 

Image shows icon appearing on the toolbar.

Ma secondo this resource, new_from_stock() è deprecato:

deprecato dalla versione 3.10: Usa Gtk.ToolButton.new() insieme Gtk.Image.new_from_icon_name() invece.

Ok allora. Così, dopo aver scavato oltre, questo è ciò che mi si avvicinò con una sostituzione:

self.fileOpen = Gtk.ToolButton(
     Gtk.Image.new_from_icon_name("document-open", 
            Gtk.IconSize.LARGE_TOOLBAR), 
     "Open") 
self.fileOpen.connect("clicked", self.on_FileOpenStandard_activate) 
toolbar.insert(self.fileOpen, -1) 

Ma questo è il risultato:

Image shows icon not appearing on the toolbar.

Qual è il modo corretto di fare questo che è ancora supportato dalla attuale libreria GTK?

risposta

4

Guardando questo C++ GitHub example, sono sorpreso di scoprire una chiamata diretta alla funzione statica new() anziché al costruttore.

Quindi ho deciso di provarlo. Guarda attentamente la differenza. È sottile

       #vvv 
self.fileOpen = Gtk.ToolButton.new(
     Gtk.Image.new_from_icon_name("document-open", 
            Gtk.IconSize.LARGE_TOOLBAR), 
     "Open") 
self.fileOpen.connect("clicked", self.on_FileOpenStandard_activate) 
toolbar.insert(self.fileOpen, -1) 

Con mia sorpresa, questo visualizza l'icona in cui l'altro approccio non lo fa.

Bonus: versione Cleaner di quanto sopra:

# iconSize to be reused 
iconSize = Gtk.IconSize.LARGE_TOOLBAR 

# ... 

openIcon = Gtk.Image.new_from_icon_name("document-open", iconSize) 
self.fileOpen = Gtk.ToolButton.new(openIcon, "Open") 
self.fileOpen.connect("clicked", self.on_FileOpenStandard_activate) 
toolbar.insert(self.fileOpen, -1) 
+1

La spiegazione di che cosa avete trovato: negli attacchi PyGObject, costruttori degli oggetti prendere solo args di parole chiave che rappresentano le proprietà GObject dell'oggetto. D'altra parte, i costruttori C, che spesso hanno parametri di convenienza extra per impostare le proprietà in quanto le proprietà possono essere ingombranti in C, sono associati come metodi 'new()'. Questo dovrebbe funzionare ugualmente bene: 'Gtk.ToolButton (icon_widget = openIcon , label = "Apri") ' – ptomato