2013-08-10 17 views
5

Sto cercando di trovare l'esempio più semplice di un widget personalizzato che viene scritto per Gtk-3.Scrivi widget personalizzato con GTK3

Finora la cosa migliore che ho trovato è this (usando PyGTK), ma sembra essere indirizzato a Gtk-2.

BTW: Non mi interessa il linguaggio in cui è scritto, ma se possiamo evitare C++, molto meglio!

risposta

0

Ecco un tutorial sulla scrittura di un widget contenitore GTK 3 personalizzato in C: http://ptomato.name/advanced-gtk-techniques/html/custom-container.html Probabilmente è più complicato di quanto sia necessario per scrivere un semplice widget. Si potrebbe anche controllare la guida migrazione da GTK 2-3: https://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html

+0

questo è dal tuo blog giusto? quando dici "Questo è piuttosto diverso dal modo in cui le cose funzionavano in GTK 2, e ci sono probabilmente un sacco di istruzioni GTK 2 ancora in circolazione su Internet." Ti consiglio di dire esplicitamente che si tratta di una tecnica GTK 3, per renderla più esplicita. – knocte

+0

e non sono sicuro di contrassegnare questa risposta come SOLVED perché in realtà non fornisce un campione, ma grazie per il link – knocte

+0

Giusto, non credo che risponda in modo soddisfacente alla tua domanda. :-( – ptomato

11

python3 GTK3 lo è, allora:

from gi.repository import Gtk 

class SuperSimpleWidget(Gtk.Label): 
    __gtype_name__ = 'SuperSimpleWidget' 

Ecco un esempio non banale che in realtà qualcosa, vale a dire dipinge la sua sfondo e disegna una linea diagonale attraverso di essa. Sto eredita da Gtk.Misc invece di Gtk.Widget per risparmiare un po 'boilerplate (vedi sotto):

class SimpleWidget(Gtk.Misc): 
    __gtype_name__ = 'SimpleWidget' 

    def __init__(self, *args, **kwds): 
     super().__init__(*args, **kwds) 
     self.set_size_request(40, 40) 

    def do_draw(self, cr): 
     # paint background 
     bg_color = self.get_style_context().get_background_color(Gtk.StateFlags.NORMAL) 
     cr.set_source_rgba(*list(bg_color)) 
     cr.paint() 
     # draw a diagonal line 
     allocation = self.get_allocation() 
     fg_color = self.get_style_context().get_color(Gtk.StateFlags.NORMAL) 
     cr.set_source_rgba(*list(fg_color)); 
     cr.set_line_width(2) 
     cr.move_to(0, 0) # top left of the widget 
     cr.line_to(allocation.width, allocation.height) 
     cr.stroke() 

Infine, se si vuole veramente derivare da Gtk.Widget poi si deve anche impostare uno sfondo di disegno. Gtk.Misc lo fa per te, ma Gtk.Widget potrebbe essere un contenitore che in realtà non disegna nulla. Ma menti indagatrici vogliono sapere, in modo da potrebbe farlo in questo modo:

from gi.repository import Gdk 

class ManualWidget(Gtk.Widget): 
    __gtype_name__ = 'ManualWidget' 

    def __init__(self, *args, **kwds): 
     # same as above 

    def do_draw(self, cr): 
     # same as above 

    def do_realize(self): 
     allocation = self.get_allocation() 
     attr = Gdk.WindowAttr() 
     attr.window_type = Gdk.WindowType.CHILD 
     attr.x = allocation.x 
     attr.y = allocation.y 
     attr.width = allocation.width 
     attr.height = allocation.height 
     attr.visual = self.get_visual() 
     attr.event_mask = self.get_events() | Gdk.EventMask.EXPOSURE_MASK 
     WAT = Gdk.WindowAttributesType 
     mask = WAT.X | WAT.Y | WAT.VISUAL 
     window = Gdk.Window(self.get_parent_window(), attr, mask); 
     self.set_window(window) 
     self.register_window(window) 
     self.set_realized(True) 
     window.set_background_pattern(None) 

Modifica e di utilizzare in realtà:

w = Gtk.Window() 
w.add(SimpleWidget()) 
w.show_all() 
w.present() 
import signal # enable Ctrl-C since there is no menu to quit 
signal.signal(signal.SIGINT, signal.SIG_DFL) 
Gtk.main() 

Oppure, più divertente, utilizzare direttamente dal ipython3 REPL:

from IPython.lib.inputhook import enable_gtk3 
enable_gtk3() 
w = Gtk.Window() 
w.add(SimpleWidget()) 
w.show_all() 
w.present() 
+0

cool! come eseguirlo con una semplice app gtk che lo rende? – knocte

Problemi correlati