14

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

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

4

4 回答 4

16

实际上 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)

希望能帮助到你!

于 2012-04-15T19:46:38.923 回答
11

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

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)
于 2014-05-12T18:37:27.723 回答
4

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

于 2017-01-18T15:53:31.493 回答
0

这对我有用:

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)
于 2018-11-26T13:58:55.920 回答