环境:Python3
图书馆:
from gi.repository import Gtk, Gdk
import cairo
Run Code Online (Sandbox Code Playgroud)
我想创建一个'pixbuf from file'但该方法在Gdk3中不再存在.
pb = Gdk.pixbuf_new_from_file('sunshine.png')
Gdk.cairo_set_source_pixbuf(cr, pb, 0, 0)
Run Code Online (Sandbox Code Playgroud)
结果:AttributeError:'gi.repository.Gdk'对象没有属性'pixbuf_new_from_file'
有人知道如何用Gdk3做到这一点吗?似乎Gdk3仅支持这些方法:
gdk_pixbuf_get_from_window
gdk_pixbuf_get_from_surface
Run Code Online (Sandbox Code Playgroud)
更新
自己找到了:
image = Gtk.Image()
image.set_from_file('sunshine.png')
pixbuf = image.get_pixbuf()
Gdk.cairo_set_source_pixbuf(cr, pixbuf, 10, 10)
Run Code Online (Sandbox Code Playgroud) 我觉得这应该很简单,但我想我错过了一些东西.
所以我想用一个库存图像设置一个窗口的图标.我试过了:
windowIcon = gtk.image_new_form_stock(gtk.STOCK_DIALOG_AUTHENTICATION, gtk.ICON_SIZE_MENU)
window.set_icon(windowIcon.get_pixbuf())
Run Code Online (Sandbox Code Playgroud)
然后Python抱怨说:
文件"./sample.py",第44行,在init
window.set_icon(windowIcon.get_pixbuf())
ValueError:image应为GdkPixbuf或为空
我尝试将gtkImage转换为GdkPixbuf,因为当我没有python抱怨时
TypeError:icon应为GdkPixbuf或None
在pygtk文档中,它说:
如果映像的存储类型不是gtk.IMAGE_EMPTY或gtk.IMAGE_PIXBUF,则会引发ValueError异常.
所以我猜测库存图像的存储类型是错误的.问题是如何解决这个问题?
我维护一个gtk3(虽然是gtk2hs和gi-gtk的混合)应用程序,它作为一个独立的状态栏,用于平铺窗口管理器,称为taffybar.
Taffybar有一个长期存在的错误,其中发生的事情导致其中一个窗口(它可以有多个窗口,例如在多个监视器上显示时)以完全停止更新(此处发布).我已经通过各种日志记录机制验证了应该更新窗口IS的代码实际上继续运行.此外,如果taffybar显示在多个窗口上,窗口将一次受到影响 - 也就是说,挂起似乎只影响它发生的窗口,这排除了UI线程上发生的任何奇怪事情或类似的东西.
不幸的是,我没有一致的方法来重现这个问题.更糟糕的是,我甚至无法想出一种以编程方式检测问题的方法.有了这个说,发现问题相对容易,因为最近添加了新的图标加载机制已经变得更糟(在最新版本中似乎每5分钟发生一次).这提醒我,我应该提到的另一件事是我相对肯定这个问题与pixbufs和图像显示有关,因为我从未见过当工作区图像模块不活动时会出现问题.
我讨厌问一个问题,甚至不能提供一致的方法来重现这个问题,但我只是不知道如何处理/调试这个问题.实际上,我很难想象我所描述的行为是如何实现的.我希望关于这个问题的特殊性质的某些东西可能对于一些比我更了解的人来说已经足够了,可能会对这个问题做出一些猜测.
为了使我的问题尽可能明确,我会将其说成如下:
什么可能导致gtk应用程序窗口挂起(停止更新)而不会崩溃应用程序或UI线程,或影响应用程序创建的任何其他窗口?
编辑:这个错误的另一个有趣的怪癖是,即使窗口停止更新,它仍然响应鼠标输入.
编辑2:另一件值得注意的事情是偶尔,我收到了这样的信息:
gtkicontheme.c:3956:proxy_pixbuf_destroy: assertion failed: (icon_info->proxy_pixbuf != NULL)
Run Code Online (Sandbox Code Playgroud)
当我尝试在代码中销毁挂起的窗口时,我也收到以下消息:
Source ID 363524 was not found when attempting to remove it
Run Code Online (Sandbox Code Playgroud)
我有时会从图标主题加载图标
如何在pixbuf中转换PIL图像?我试图改变许多例子,但没有解决方案
import array
from gi.repository import GdkPixbuf
def image2pixbuf(self,im):
arr = array.array('B', im.tostring())
height, width = im.size
return GdkPixbuf.Pixbuf.new_from_data(arr, GdkPixbuf.Colorspace.RGB,
True, 8, width, height, width * 4)
Run Code Online (Sandbox Code Playgroud)
错误
TypeError: new_from_data () takes Exactly 9 arguments (7 given)
Run Code Online (Sandbox Code Playgroud)
我使用Pygobject https://live.gnome.org/PyGObject
我知道Gdk-Pixbuf支持png和jpg,但是我找不到Internet上任何完全(或部分)支持的图像格式的确切列表。这对于我当前的项目是必要的,因为我需要检查目录中每个文件的扩展名并确定gdk-pixbuf是否支持该文件。有什么帮助吗?
我在加载文件或在Gtk TreeView(GTK3的Python绑定)的一列中显示颜色时遇到困难.从QGIS中获取的示例在第一行显示图标,在第二行显示蓝色圆圈.颜色取自图层属性:
我的代码看起来像这样,但不会将icon.png文件加载到同一目录中:
#!/usr/bin/python3
from gi.repository import Gtk, Gdk, GdkPixbuf
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_default_size(200, 200)
self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, str)
self.treeview = Gtk.TreeView(model=self.liststore)
symbol1 = GdkPixbuf.Pixbuf.new_from_file("icon.png")
self.liststore.append([symbol1, "This is a symbol1"])
symbol2 = Gtk.IconTheme.get_default().load_icon("gtk-cut", 64, 0)
self.liststore.append([symbol2, "This is symbol2"])
px_renderer = Gtk.CellRendererPixbuf()
px_column = Gtk.TreeViewColumn("Icon", px_renderer)
self.treeview.append_column(px_column)
str_renderer = Gtk.CellRendererText()
str_column = Gtk.TreeViewColumn("Name", str_renderer, text=1)
self.treeview.append_column(str_column)
self.add(self.treeview)
win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
GTK3 pixbuf的文档在这里:
PyGTK的旧例子就在这里,但是处理它的方式确实发生了变化:
我正在使用GAppInfo / GDesktopAppInfo。
GIcon *icon = gtk_app_info_get_icon (G_APP_INFO(appinfo));
现在,我需要将其放在GtkIconView上,但是我发现无法通过GIcon创建GdkPixbuf。有人知道吗?非常感谢!
编辑1:实际上是GThemedIcon。
我正在努力将二进制数据变成一个gtk.gdk.pixbuf
.
这应该说明我的问题:
file = open("image.jpg", "rb")
//Ultimately this is going to come from a BLOB
binary = f.read()
//I created a pixbuf directly from the jpg
//and took the rowstride values &c. from that
pixbuf = gtk.gdk.pixbuf_new_from_data(
binary, gtk.gdk.COLORSPACE_RGB, False, 8 , 450, 640, 1352)
Run Code Online (Sandbox Code Playgroud)
这失败了:
ValueError: data length (90825) is less then required by the other parameters (865280)
我目前的解决方法是将二进制数据写入文件,然后Pixbuf
从该文件创建.这只是感觉很hacky.我正在从数据库中读取二进制数据,所以我真的需要一个可以直接从缓冲区创建pixbuf的解决方案.
我不明白为什么如果我只是BLOB
从数据库中读取并将其写入文件 - 然后将文件作为pixbuf加载,这很容易,但更难直接从缓冲区!
我究竟做错了什么?
使用GTK + 3.6我想从内存中的缓冲区显示图像,而不是磁盘上的文件.我有一个const char *data
图像数据,我正在尝试从它创建一个GTK图像.到目前为止,我已经尝试了两种我认为可行的方法.两者都使用GdkPixbuf,因此需要图像数据guchar* (unsigned char*)
.
有了这个要求,我必须投射数据:
guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
Run Code Online (Sandbox Code Playgroud)
然后我尝试了以下内容:
将数据写入GdkPixbufLoader gdk_pixbuf_loader_write
.在这里我得到一个错误"Unrecognized image file format"
或者如果我用特定类型(jpg)创建加载器我得到一个错误,说它不是JPG文件格式(它是,如下所述).
编辑:一些代码:
guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
int stride = ((1056 * 32 + 31) & ~31)/8;
GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
GError *error = NULL;
if(!gdk_pixbuf_loader_write(loader, gudata, data_size, &error)
{
printf("Error:\n%s\n", error->message);
}
Run Code Online (Sandbox Code Playgroud)
编辑03/01/2013:从写入函数中删除了stride参数 - 错误打印.
开罗表面不起作用.显示黑屏和噪音.
初始化pixbuf gdk_pixbuf_new_from_data
然后图像看起来像电视噪声,这表明数据是错误的(并且已经被转换),或者其他参数是错误的(图像行步幅,但它不是:)).
之后的错误我只是想将数据写入到文件中foo.jpg
使用ofstream
,是的,我得到一个正常的图像文件.file
终端中的命令确认它是一个JPEG图像,并且使用一个简单的代码块我从该foo.jpg创建了一个GdkPixbuf来检查它的行步长值,它匹配我传递给上述函数的值.
图像数据是否因演员表而损坏,如果是,我该如何解决?我得到了图像数据const char*
.我看过QtPixmap,它也加载了unsigned char*
.
我需要使用单独的库吗?(libjpeg?)我安装了libgtk3-dev.
谢谢!