【问题标题】:Embed icon in python script在 python 脚本中嵌入图标
【发布时间】:2012-03-29 16:27:00
【问题描述】:

有没有人知道在 Python 脚本中嵌入图标的方法,这样当我创建独立的可执行文件(使用 pyinstaller)时,我不需要包含 .ico 文件?我知道 py2exe 可以做到这一点,但就我而言,我必须使用 Pyinstaller,因为我没有成功使用前者。我正在使用 Tkinter。

我知道 iconbitmap(iconName.ico),但如果我想让 onefile 可执行,那就不行了。

【问题讨论】:

  • 只是为了更清楚:我想更改我的应用程序窗口的图标(默认情况下具有 Tk 徽标),而不是我的文件图标(可以使用 Pyinstaller 轻松完成)
  • 啊哈!在谷歌搜索后,我在 Stack Overflow here 上找到了答案。这有帮助吗?
  • 是的,我以前见过那个。这正是我同样的问题。我只是不明白他在那里做什么。它看起来确实是正确的解决方案,也许我应该多挖一点。谢谢!

标签: python icons tkinter exe pyinstaller


【解决方案1】:

实际上iconbitmap函数只能接收一个文件名作为参数,所以那里需要有一个文件。您可以在链接之后制作图标的Base64 版本(字符串版本),上传文件并将结果作为变量字符串复制到源文件中。将其提取到一个临时文件,最后将该文件传递给 iconbitmap 并删除它。很简单:

import base64
import os
from Tkinter import *
##The Base64 icon version as a string
icon = \
""" REPLACE THIS WITH YOUR BASE64 VERSION OF THE ICON
"""
icondata= base64.b64decode(icon)
## The temp file is icon.ico
tempFile= "icon.ico"
iconfile= open(tempFile,"wb")
## Extract the icon
iconfile.write(icondata)
iconfile.close()
root = Tk()
root.wm_iconbitmap(tempFile)
## Delete the tempfile
os.remove(tempFile)

希望对你有帮助!

【讨论】:

  • 非常感谢,效果很好!您是否知道如何更改使用 Matplotlib 创建的图形窗口中的图标?我的应用程序现在有了我的图标,但是当我绘制图表时,新窗口仍然有 TK 徽标作为图标。许多人认为你的帮助
  • 对不起,我不了解Matplotlib,但是如果没有更改图标的功能,我认为没有办法。 wm_iconbitmap 在 Matplotlib 中不起作用吗?
【解决方案2】:

你可能不需要这个,但其他人可能会觉得这很有用,我发现你可以在不创建文件的情况下做到这一点:

import Tkinter as tk

icon = """
    REPLACE THIS WITH YOUR BASE64 VERSION OF THE ICON
    """

root = tk.Tk()
img = tk.PhotoImage(data=icon)
root.tk.call('wm', 'iconphoto', root._w, img)

【讨论】:

  • 我实际上无法在 Python 3.4.3 中使用此方法或 Sam 的方法来处理图标,但 Saulpila 的方法有效,因此我知道 Base64 代码没有任何错误。
【解决方案3】:

ALI3N 的解决方案

按照以下步骤操作:

  1. 像这样编辑您的 .spec 文件:
a = Analysis(....)
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          a.binaries + [('your.ico', 'path_to_your.ico', 'DATA')], 
          a.zipfiles,
          a.datas, 
          name=....
       )
  1. 将此添加到您的脚本中:
datafile = "your.ico" 
if not hasattr(sys, "frozen"):
    datafile = os.path.join(os.path.dirname(__file__), datafile) 
else:  
    datafile = os.path.join(sys.prefix, datafile)
  1. 这样使用:
root = tk.Tk()
root.iconbitmap(default=datafile)

因为在您使用 Pyinstaller 编译脚本后这将不起作用:

root = tk.Tk()
root.iconbitmap(default="path/to/your.ico")

我的信息:python3.4、pyinstaller3.1.1

【讨论】:

  • 我收到错误:SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXXXX escape
  • 对我来说,解决方案是使用 path_to_your.ico 的相对路径而不是绝对路径,它就像一个魅力。
【解决方案4】:

这对我有用:

from tkinter import  PhotoImage
import base64
img = """
REPLACE THIS WITH YOUR BASE64 VERSION OF THE ICON
"""
img= base64.b64decode(img)

root = Tk()
img=PhotoImage(data=img) 
root.wm_iconphoto(True, img)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多