有没有人知道在 Python 脚本中嵌入图标的方法,这样当我创建独立的可执行文件(使用 pyinstaller)时,我不需要包含 .ico 文件?我知道 py2exe 可以做到这一点,但就我而言,我必须使用 Pyinstaller,因为我没有成功使用前者。我正在使用 Tkinter。
我知道,iconbitmap(iconName.ico)
但如果我想让 onefile 可执行,那它就行不通了。
有没有人知道在 Python 脚本中嵌入图标的方法,这样当我创建独立的可执行文件(使用 pyinstaller)时,我不需要包含 .ico 文件?我知道 py2exe 可以做到这一点,但就我而言,我必须使用 Pyinstaller,因为我没有成功使用前者。我正在使用 Tkinter。
我知道,iconbitmap(iconName.ico)
但如果我想让 onefile 可执行,那它就行不通了。
实际上 iconbitmap 函数只能接收一个文件名作为参数,所以那里需要一个文件。您可以在链接之后制作图标的Base64版本(A 字符串版本),上传文件并将结果作为变量字符串复制到源文件中。将其提取到一个临时文件,最后将该文件传递给 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)
希望能帮助到你!
你可能不需要这个,但其他人可能会觉得这很有用,我发现你可以在不创建文件的情况下做到这一点:
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)
ALI3N 的解决方案
按着这些次序:
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=.... )
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)
root = tk.Tk() root.iconbitmap(default=datafile)
因为在您使用 Pyinstaller 编译脚本后这将不起作用:
root = tk.Tk() root.iconbitmap(default="path/to/your.ico")
我的信息:python3.4,pyinstaller3.1.1
这对我有用:
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)