Python3 GTK3 это, то:
from gi.repository import Gtk
class SuperSimpleWidget(Gtk.Label):
__gtype_name__ = 'SuperSimpleWidget'
Вот нетривиальный пример того, что на самом деле делает что-то, а именно рисует его фон и рисует диагональную линию через него. Я унаследовав от Gtk.Misc
вместо Gtk.Widget
сэкономить шаблонного (см):
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()
Наконец, если вы действительно хотите получить от Gtk.Widget
, то вы также должны создать фон для рисования. Gtk.Misc
делает это для вас, но Gtk.Widget
может быть контейнером, который на самом деле ничего не рисует. Но пытливые умы хотят знать, так что вы могли это сделать так:
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)
Edit и на самом деле использовать его:
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()
Или, больше удовольствия, использовать его непосредственно из ipython3 РЕПЛ:
from IPython.lib.inputhook import enable_gtk3
enable_gtk3()
w = Gtk.Window()
w.add(SimpleWidget())
w.show_all()
w.present()
это из вашего блога? когда вы говорите: «Это сильно отличается от того, как все работает в GTK 2, и, вероятно, в Интернете есть много инструкций GTK 2». Я рекомендую вам прямо сказать, что это технология GTK 3, чтобы сделать ее более явной. – knocte
и не уверен, что я собираюсь отметить этот ответ как SOLVED, потому что он действительно не дает образец, но спасибо за ссылку – knocte
Правильно, я не думаю, что он удовлетворительно отвечает на ваш вопрос. :-( – ptomato