我正在尝试找到为Gtk-3编写的自定义窗口小部件的最简单示例。
到目前为止,我发现的最好的事情是this(使用PyGTK),但似乎是针对Gtk-2。
BTW:我不关心它所写的语言,但如果我们能避免使用C ++,那就更好了!答案 0 :(得分:11)
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)
编辑并实际使用它:
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 REPL中使用它:
from IPython.lib.inputhook import enable_gtk3
enable_gtk3()
w = Gtk.Window()
w.add(SimpleWidget())
w.show_all()
w.present()
答案 1 :(得分:0)
这是一篇关于在C中编写GTK 3自定义容器小部件的教程:http://ptomato.name/advanced-gtk-techniques/html/custom-container.html这可能比编写一个简单的小部件更复杂。您还可以查看从GTK 2到3的迁移指南:https://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html
答案 2 :(得分:0)
迄今为止最好的参考:
- 了解Gobject(来自于gtk小部件派生)
- 有一些锅炉代码和c代码
https://developer.gnome.org/gobject/stable/howto-gobject.html
我知道这不是Python编写的,但是从c转换为python是件小事 (问题是算法,而不是语言)