在Python脚本中嵌入图标

问题描述 投票:0回答:6

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

我知道

iconbitmap(iconName.ico)
,但如果我想制作一个可执行文件,那是行不通的。

python icons tkinter exe pyinstaller
6个回答
26
投票

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

希望有帮助!


13
投票

您可能不需要这个,但其他人可能会发现这很有用,我发现您可以在不创建文件的情况下完成它:

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)

5
投票

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


2
投票

这对我有用:

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)

1
投票
import Tkinter as tk

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

root = tk.Tk() 
root.iconphoto(True, PhotoImage(data=icon))

转换 .png 文件而不是图标,也使用 utf-8 编码和上面相同的代码对我来说非常有用!


0
投票

有一个更简单、更有效的方法来解决这个问题。

既然你已经:

root.iconbitmap("icon.ico")

并且由于它使用与 EXE 文件位于同一目录中的文件您所要做的就是复制该文件并将其放在与应用程序相同的目录中。

© www.soinside.com 2019 - 2024. All rights reserved.