栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用GTK3和PyGObject绘制GdkPixbuf

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用GTK3和PyGObject绘制GdkPixbuf

新的 绘制 信号使用已将cairo上下文作为参数传递的回调,您无需

window =widget.get_window()
像在PyGtk中所做的那样在参加 暴露事件 信号时就获得cairo上下文。在PYGObject中比较简单:

import cairoclass Foo(object):    def __init__(self):       (...)        self.image = cairo.ImageSurface.create_from_png('logo.png')       (...)    def draw(self, widget, context):        if self.image is not None: context.set_source_surface(self.image, 0.0, 0.0) context.paint()        else: print('Invalid image')        return False

那就是如果您不需要PixBuf,但是如果您需要它来做其他事情,则可以有几种选择:

  1. 使两个对象都在内存中。如果两者都是从PNG加载的,那么除了浪费内存外,应该不会有太多问题。
  2. 将GdkPixbuf转换为PIL图像,然后将PIL图像转换为数据数组,然后使用create_for_data()从该数据数组创建Cairo ImageSurface。k牛:SI不太了解,对不起:S
  3. 使用 hock 建议的 Gdk.cairo_set_source_pixbuf() 。这似乎是在ImageSurface中绘制Pixbuf的正确方法,但是它完全是非Python的(这就是为什么我讨厌这种自省的东西,它们看起来都像C,就像一个坏的C端口)。

如果您选择糟糕的第二个选项,请按以下步骤操作:

import Imageimport arrayfrom gi.repository import Gtk, GdkPixbufwidth = 25height = 25pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size('logo.png', width, height)pil_image = Image.fromstring('RGBA', (width, height), pixbuf.get_pixels())byte_array = array.array('B', pil_image.tostring())cairo_surface = cairo.ImageSurface.create_for_data(byte_array, cairo.FORMAT_ARGB32, width, height, width * 4)

需要注意的是 create_for_data()
是尚未提供Python3,只为Python2。

如果这是您要达到的目的,还请查看我的回答如何在PyGObject中使用双缓冲区:在PyGobject(python3)中绘图

亲切的问候



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号