2012-03-29 77 views
5

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

我知道iconbitmap(iconName.ico),但如果我想制作一个onefile可执行文件,那不起作用。

+0

只是为了更清楚:我要改变我的应用程序窗口(默认情况下有Tk的标志)的图标,而不是图标我文件(可以使用Pyinstaller轻松完成) – maupertius 2012-03-30 13:12:41

+0

啊哈!谷歌搜索多一点后,我发现堆栈溢出[这里](http://stackoverflow.com/a/7675014/404469)的答案。这有帮助吗? – gary 2012-03-30 14:26:33

+0

是的,我以前见过那个。这完全是我的同样的问题。我只是不明白他在那里做了什么。它确实看起来是正确的解决方案,也许我应该多挖一点。谢谢! – maupertius 2012-03-30 14:35:32

回答

6

其实函数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) 

希望它有帮助!

+0

非常感谢,这工作很好!你有没有机会知道如何改变Matplotlib创建的图形窗口中的图标?我的应用程序现在已经有了我的图标,但是当我绘制图表时,新窗口仍然有TK标志作为图标。许多人认为你的帮助 – maupertius 2012-04-17 10:32:24

+0

对不起,我不知道Matplotlib,但如果没有改变图标的​​功能,我不认为有办法。不是wm_iconbitmap在Matplotlib中工作吗? – Saulpila 2012-04-18 03:18:19

5

你也许并不需要这一点,但其他人可能会发现这个有用的,我发现你能做到这一点,而无需创建一个文件:

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) 
+0

http://code.activestate.com/recipes/52264-inline-gifs-with-tkinter/ – Sam 2014-05-13 00:28:15

+0

我实际上无法获得此方法或Sam的方法在Python 3.4中使用图标。3但Saulpila的方法奏效,所以我知道Base64代码没有任何错误。 – zfb 2015-04-21 05:29:51

0

解决方案通过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=.... 
     ) 
  • 添加到您的脚本:
  • 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

    +0

    我得到错误:SyntaxError:(unicode错误)'unicodeescape'编解码器无法解码位置2-3中的字节:截断\ UXXXXXXXX转义 – alienware13user 2017-04-16 22:05:32