Python 如何将内联图像添加到PyGObject 3?

Python 如何将内联图像添加到PyGObject 3?,python,gtk3,pygtk,pygobject,Python,Gtk3,Pygtk,Pygobject,我想把内联图像放入我的PyGObject 3程序中,这样它们就不必从磁盘加载。John Finlay的免费电子书“PyGTK 2.0教程”给出了两个代码示例。所有这些都是为了PyGTK 2而不是gi/PyGObject 3。它不必是XPM数据,这只是在PyGTK2中实现的一种简单方法。下面是示例pixmap.py的编辑版本 如何将这个工作示例更改为PyGObject 3,或者是否有另一个更简单的方法将内联图像添加到PyGObject 3的工作示例 import pygtk pygtk.requi

我想把内联图像放入我的PyGObject 3程序中,这样它们就不必从磁盘加载。John Finlay的免费电子书“PyGTK 2.0教程”给出了两个代码示例。所有这些都是为了PyGTK 2而不是gi/PyGObject 3。它不必是XPM数据,这只是在PyGTK2中实现的一种简单方法。下面是示例pixmap.py的编辑版本

如何将这个工作示例更改为PyGObject 3,或者是否有另一个更简单的方法将内联图像添加到PyGObject 3的工作示例

import pygtk
pygtk.require('2.0')
import gtk

xpm_data = [
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFFFFFF",
"                ",
"   ......       ",
"   .XXX.X.      ",
"   .XXX.XX.     ",
"   .XXX.XXX.    ",
"   .XXX.....    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .........    ",
"                ",
"                "
]

class PixmapExample:
    def close_application(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.connect("delete_event", self.close_application)
        window.set_border_width(10)
        window.show()

        pixmap, mask = gtk.gdk.pixmap_create_from_xpm_d(window.window, 
                                                        None, 
                                                        xpm_data)
        
        image = gtk.Image()
        image.set_from_pixmap(pixmap, mask)
        image.show()

        button = gtk.Button()
        button.add(image)
        window.add(button)
        button.show()

def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    PixmapExample()
    main()

这是您的示例的一个直接端口。该解决方案利用函数创建图像

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GdkPixbuf

xpm_data = [
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFFFFFF",
"                ",
"   ......       ",
"   .XXX.X.      ",
"   .XXX.XX.     ",
"   .XXX.XXX.    ",
"   .XXX.....    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .........    ",
"                ",
"                "
]

class PixmapExample:
    def close_application(self, widget, event, data=None):
        Gtk.main_quit()
        return False

    def __init__(self):
        window = Gtk.Window()
        window.connect("delete_event", self.close_application)
        window.set_border_width(10)
        window.show()

        pixbuf = GdkPixbuf.Pixbuf.new_from_xpm_data(xpm_data)
        image = Gtk.Image()
        image.set_from_pixbuf(pixbuf)
        image.show()

        button = Gtk.Button()
        button.add(image)
        window.add(button)
        button.show()

def main():
    Gtk.main()
    return 0

if __name__ == "__main__":
    PixmapExample()
    main()

在研究了博哈拉克斯的答案后,我整理出了最简单的版本

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GdkPixbuf

xpm_data = [
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFFFFFF",
"                ",
"   ......       ",
"   .XXX.X.      ",
"   .XXX.XX.     ",
"   .XXX.XXX.    ",
"   .XXX.....    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .........    ",
"                ",
"                "
]

window = Gtk.Window()

image = Gtk.Image()
pixbuf = GdkPixbuf.Pixbuf.new_from_xpm_data(xpm_data)
image.set_from_pixbuf(pixbuf)

window.add(image)

window.connect("destroy", Gtk.main_quit)

window.show_all()
Gtk.main()

谢谢你,波拉克斯,你太棒了!!你不仅帮助了我,而且还帮助了每一个想在程序中添加内联图像的初学者!这给了我一个错误:“内联XPM数据被破坏:维度与数据不匹配”编辑:不,不管怎样,这是我的错误;我批量更换了一些东西,这也损坏了XPM。使用如上所示的原始变体确实有效,我可以按原样确认这一点。