使用 pygtk 和 Glade 将 pixbuf 绘制到绘图区域上

发布于 2024-07-17 01:30:27 字数 572 浏览 13 评论 0原文

我正在尝试用 python 制作一个 GTK 应用程序,我可以将加载的图像绘制到屏幕上,然后单击它。 我尝试执行此操作的方法是将图像加载到 pixbuf 文件中,然后将该 pixbuf 绘制到绘图区域上。

主代码行在这里:

def drawing_refresh(self, widget, event):
    #clear the screen
    widget.window.draw_rectangle(widget.get_style().white_gc, True, 0, 0, 400, 400) 
    for n in self.nodes:
         widget.window.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL],
                                   self.node_image, 0, 0, 0, 0)

这应该只是将 pixbuf 绘制到左上角的图像上,但除了白色图像之外什么都没有显示。 我已经测试了 pixbuf 通过将其放入 gtk 图像中来加载。 我在这里做错了什么?

i'm trying to make a GTK application in python where I can just draw a loaded image onto the screen where I click on it. The way I am trying to do this is by loading the image into a pixbuf file, and then drawing that pixbuf onto a drawing area.

the main line of code is here:

def drawing_refresh(self, widget, event):
    #clear the screen
    widget.window.draw_rectangle(widget.get_style().white_gc, True, 0, 0, 400, 400) 
    for n in self.nodes:
         widget.window.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL],
                                   self.node_image, 0, 0, 0, 0)

This should just draw the pixbuf onto the image in the top left corner, but nothing shows but the white image. I have tested that the pixbuf loads by putting it into a gtk image. What am I doing wrong here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烧了回忆取暖 2024-07-24 01:30:27

您可以利用 cairo 来执行此操作。 首先,创建一个基于 gtk.DrawingArea 的类,并将暴露事件连接到您的暴露函数。

class draw(gtk.gdk.DrawingArea):
    def __init__(self):
        self.connect('expose-event', self._do_expose)
        self.pixbuf = self.gen_pixbuf_from_file(PATH_TO_THE_FILE)

    def _do_expose(self, widget, event):
        cr = self.window.cairo_create()
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.set_source_rgb(1,1,1)
        cr.paint()
        cr.set_source_pixbuf(self.pixbuf, 0, 0)
        cr.paint()

这将在每次发出暴露事件时绘制图像。

You can make use of cairo to do this. First, create a gtk.DrawingArea based class, and connect the expose-event to your expose func.

class draw(gtk.gdk.DrawingArea):
    def __init__(self):
        self.connect('expose-event', self._do_expose)
        self.pixbuf = self.gen_pixbuf_from_file(PATH_TO_THE_FILE)

    def _do_expose(self, widget, event):
        cr = self.window.cairo_create()
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.set_source_rgb(1,1,1)
        cr.paint()
        cr.set_source_pixbuf(self.pixbuf, 0, 0)
        cr.paint()

This will draw the image every time the expose-event is emited.

完美的未来在梦里 2024-07-24 01:30:27

我发现我只需要让函数在函数末尾使用 widget.queue_draw() 调用另一个公开事件。 该函数在开始时仅被调用一次,并且此时没有可用的节点,因此没有绘制任何内容。

I found out I just need to get the function to call another expose event with widget.queue_draw() at the end of the function. The function was only being called once at the start, and there were no nodes available at this point so nothing was being drawn.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文