2012-03-29 94 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