我在用着Gtk.StatusIcon
,并且想要改变某些像素的颜色;我有一段工作代码,它加载一个带有我想要设置的颜色的 1x1 像素 PNG 文件,然后将其复制到图标 Pixbuf。
虽然这种方法有效,但它有一个明显的缺点,即必须为每种颜色创建 1x1 像素,因此我不能使用任意颜色,只能使用我为其创建图像的预定义颜色。
如何将像素设置为任意 RGBA 颜色?
我现在使用的代码(出于演示目的而简化):
#!/usr/bin/env python
from gi.repository import Gtk, GLib, GdkPixbuf
def set_icon_cb(widget, data=None):
set_icon(widget)
def set_icon(icon):
fill_amount = 20
img = GdkPixbuf.Pixbuf.new_from_file('./data/icons/battery.png')
fill = GdkPixbuf.Pixbuf.new_from_file('./data/icons/green.png')
for row_num, row in enumerate(zip(*(iter(img.get_pixels()),) *img.get_rowstride())):
# Blank row
if 255 not in row: continue
for col_num, pixel in enumerate(zip(*(iter(row),) * 4)):
r, g, b, a = pixel
if col_num > 2 and col_num <= fill_amount and a == 0:
fill.copy_area(0, 0, 1, 1, img, col_num, row_num)
icon.set_from_pixbuf(img)
icon = Gtk.StatusIcon()
icon.connect('activate', set_icon_cb)
set_icon(icon)
Gtk.main()
我尝试创建一个新的 Pixbuf 对象GdkPixbuf.PixbufLoader
,但这似乎需要一个 PNG 图像,而不是一个字节对象,所以这不是很有帮助:
fill = GdkPixbuf.PixbufLoader()
fill.write(b'\x88\x88\x88\xff')
fill.close()
fill = fill.get_pixbuf()
# Gives error:
# GLib.Error: gdk-pixbuf-error-quark: Unrecognized image file format (3)
我的下一次尝试是使用GdkPixbuf.Pixbuf.new_from_data
,看起来很有前途:
fill = GdkPixbuf.Pixbuf.new_from_data(b'\xff\x00\xff', GdkPixbuf.Colorspace.RGB,
False, 8, 1, 1, 3)
然而,这也行不通。它不仅将像素设置为错误的颜色,还在多次调用时将其设置为不同的颜色set_icon()
; print(fill.get_pixels())
给我b'\x00\x00\x00'
...我用错了吗?我绑定了各种不同的参数,但都给出了相同的结果......
我还找到了一个 C 示例,它修改了结果gdk_pixbuf_get_pixels()
,因为这会返回指向图像数据的指针。但这不是你可以在 Python 中完成的事情(据我所知)。
我想要完成的事情的一些背景:
我有一个小托盘应用程序来显示我的笔记本电脑的电池状态;它会填满电池图标,以指示剩余的电池电量。低于一定百分比,颜色从绿色变为红色(这适用于上面的示例),但我希望在这方面有更大的灵活性;例如。允许其他人设置自己的绿色阴影,或使用紫色,或其他。