在python脚本中嵌入图标

时间:2012-03-29 16:27:00

标签: python icons tkinter exe pyinstaller

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

我知道iconbitmap(iconName.ico)但如果我想创建一个可执行的文件,那就不行了。

4 个答案:

答案 0 :(得分:14)

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

希望它有所帮助!

答案 1 :(得分:8)

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

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)

答案 2 :(得分:1)

ALI3N的解决方案

请按照以下步骤操作:

  1. 像这样编辑你的.spec文件:
  2. 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. 将此添加到您的脚本中:
    2. 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. 以这种方式使用:
      2. root = tk.Tk()
        root.iconbitmap(default=datafile)
        

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

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

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

答案 3 :(得分: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)