gpt4 book ai didi

python - 如何使用 GTK3 和 PyGObject 绘制 GdkPixbuf

转载 作者:太空狗 更新时间:2023-10-29 20:41:03 25 4
gpt4 key购买 nike

我有一个小型应用程序,它使用 DrawingArea 使用 PyGObjectGTK3 绘制简单的 map 。

我使用

加载一个 Pixbuf
from gi.repository import Gtk, GdkPixbuf
pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size("logo.png", 25, 25)

然后尝试在DrawingArea的绘图事件信号中绘制它

def draw(self, widget, context):
window = widget.get_window()
ctx = window.cairo_create()
ctx.set_source_pixbuf(pixbuf, 0, 0)

但是我收到了错误信息

"AttributeError: 'cairo.Context' object has no attribute 'set_source_pixbuf'"

如果我正在阅读 Gtk2 to Gtk3 migration guide正确,这应该有效。我做错了什么?

最佳答案

新的 draw 信号使用一个已经将 cairo 上下文作为参数传递的回调,您不需要执行类似 window = widget.get_window() 的操作就像您在 PyGtk 中所做的那样,在参与 expose-event 信号时获取 cairo 上下文。在 PYGObject 中更简单:

import cairo

class 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 Image,然后将 PIL Image 转换为数据数组,然后使用 create_for_data() 从该数据数组创建 Cairo ImageSurface。牦牛 :S 我不知道更好,抱歉 :S
  3. 使用hock 提出的Gdk.cairo_set_source_pixbuf()。这似乎是在 ImageSurface 中绘制 Pixbuf 的正确方法,但它完全不是 pythonic(这就是为什么我讨厌这种内省(introspection)的东西,它们看起来都像 C,就像一个糟糕的 C 端口)。

如果你选择糟糕的第二个选项,这里是如何:

import Image
import array
from gi.repository import Gtk, GdkPixbuf

width = 25
height = 25
pixbuf = 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()not yet available for Python3 , only for Python2 .

如果这是您想要实现的目标,请查看我关于如何在 PyGObject 中使用双缓冲区的回答:Drawing in PyGobject (python3)

亲切的问候

关于python - 如何使用 GTK3 和 PyGObject 绘制 GdkPixbuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10270080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com