【问题标题】:How to embed an image to use with wx.iconfrombitmap(wx.bitmap(path)) python如何嵌入图像以与 wx.iconfrombitmap(wx.bitmap(path)) python 一起使用
【发布时间】:2017-07-16 08:27:29
【问题描述】:

我有一个 python 应用程序,我从here 获得并根据我的需要进行了修改,但我想将用于图标的图像放在脚本中,我知道可能存在性能问题,但这不是目前的问题,我所需要的只是将所有文件放在一个文件中,这样我就可以轻松地与我的朋友和我的计算机进行更改。 所以我的问题是,如何使用嵌入的图标图像(png 文件,可以是任何类型)和这行代码来获取文件的路径,而不是文件本身?

   def set_icon(self, path):
    icon = wx.IconFromBitmap(wx.Bitmap(path))
    self.SetIcon(icon, TRAY_TOOLTIP)

我尝试使用 img2py、base64,但没有任何效果,所以我认为这可能是所需的路径而不是文件。 如何更改/修改脚本(或 wx 库)以使其与嵌入文件而不是它们的路径一起使用?

【问题讨论】:

    标签: python wxpython embed


    【解决方案1】:

    我通常实现这个的方式是把base64和zlib结合起来

    通过

    生成嵌入的图像数据
        from zlib import compress
        from base64 import b64encode
        with open("image.png", "rb") as fileobj:
            data = b64encode(compress(fileobj.read()))
    

    使用三引号将“数据”复制到您的脚本,并根据需要插入换行符。

    data = """Tm90IGFjdHVhbCBwaWN0dXJlIGRhdGE="""

    当需要重新创建图像数据时,只需反转编码和压缩即可

    from base64 import b64decode
    from zlib import decompress
    image_data = decompress(b64decode(data))
    

    如何重新创建位图对象取决于您的 wxpython 版本。使用 phoenix 构建,您可以调用从流中创建 wx.Image,然后从图像中调用 wx.Bitmap

    from io import BytesIO
    stream = BytesIO(bytearray(image_data)) # just bytes() for py3
    image = wx.Image(stream, wx.BITMAP_TYPE_ANY) # wx.ImageFromStream for legacy wx
    bitmap = wx.Bitmap(image) # wx.BitmapFromImage for legacy wx
    

    在我的使用中,我没有注意到性能影响,即使使用多个嵌入文件

    【讨论】:

    • wxPython 中包含一些工具,可以帮助将图像文件编码为 python 模块作为PyEmbeddedImage 对象,它具有将其转换为wx.Imagewx.Bitmap 等的方法。见python -m wx.tools.img2py --help
    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多