首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GTK3编写自定义小部件

使用GTK3编写自定义小部件
EN

Stack Overflow用户
提问于 2013-08-10 16:58:53
回答 3查看 10K关注 0票数 7

我正在尝试寻找为Gtk-3编写的自定义小部件的最简单示例。

到目前为止,我找到的最好的东西是this (使用PyGTK),但它似乎是针对Gtk-2的。

顺便说一句:我不关心它是用什么语言写的,但如果我们能避免C++,那就更好了!

EN

回答 3

Stack Overflow用户

发布于 2013-12-15 22:22:42

Python3 Gtk3 it is,然后:

代码语言:javascript
复制
from gi.repository import Gtk

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

这是一个很重要的例子,它实际做了一些事情,即绘制其背景并通过它绘制一条对角线。我继承了Gtk.Misc而不是Gtk.Widget来保存一些样板文件(如下所示):

代码语言:javascript
复制
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可以是一个本身并不实际绘制任何内容的容器。但是好奇的人想知道,所以你可以这样做:

代码语言:javascript
复制
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)

编辑并实际使用它:

代码语言:javascript
复制
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中使用它:

代码语言:javascript
复制
from IPython.lib.inputhook import enable_gtk3
enable_gtk3()
w = Gtk.Window()
w.add(SimpleWidget())
w.show_all()
w.present()
票数 11
EN

Stack Overflow用户

发布于 2013-08-11 13:21:45

这是一个关于用C:http://ptomato.name/advanced-gtk-techniques/html/custom-container.html编写GTK3自定义容器小部件的教程,它可能比编写一个简单的小部件更复杂。您还可以查看从gtk2到gtk3的迁移指南:https://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html

票数 0
EN

Stack Overflow用户

发布于 2014-08-30 14:46:50

到目前为止,最好的参考是:

  • 了解Gobject (从gtk widget派生)
  • 有一些锅炉代码和c代码

https://developer.gnome.org/gobject/stable/howto-gobject.html

我知道这不是Python写的,但是从c到python的转换是小菜一碟(重要的是算法,而不是语言)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18160315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档