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()
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
e non sono sicuro di contrassegnare questa risposta come SOLVED perché in realtà non fornisce un campione, ma grazie per il link – knocte
Giusto, non credo che risponda in modo soddisfacente alla tua domanda. :-( – ptomato