【问题标题】:How do you add an inline image to PyGObject 3?如何将内联图像添加到 PyGObject 3?
【发布时间】:2021-01-18 21:48:58
【问题描述】:

我想将内联图像放入我的 PyGObject 3 程序中,这样就不必从磁盘加载它们。 YoLinux shows how to edit an XPM file so its text can be inserted into Python code. John Finlay 的免费电子书《PyGTK 2.0 教程》给出了两个代码示例。所有这些都是针对 PyGTK 2 而不是 gi / PyGObject 3。它不一定是 XPM 数据,这只是在 PyGTK 2 中实现它的一种简单方法。下面是示例 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()

【问题讨论】:

    标签: python gtk3 pygtk pygobject


    【解决方案1】:

    这是您的示例到PyGObject 3 的直接端口。该解决方案利用GdkPixbuf.Pixbuf.new_from_xpm_data() 函数创建图像。

    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()
    

    【讨论】:

    • 谢谢,bohrax,你太棒了!!您不仅帮助了我,还帮助了​​每一个想在他们的程序中添加内嵌图像的初学者!
    • 这给了我这个错误:“内联 XPM 数据已损坏:尺寸与数据不匹配” 编辑:不,没关系,是我的错误;我批量更换了一些东西,这也破坏了 XPM。使用如上所示的原始变体确实有效,我可以按原样确认。
    【解决方案2】:

    在研究了 bohrax 的答案后,我整理了最简单的版本。

    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()
    

    【讨论】:

      猜你喜欢
      • 2023-01-23
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多