将ico文件添加到pyinstaller

时间:2017-08-11 06:45:29

标签: python tkinter python-3.5 pyinstaller

我在tkinter

python 3.5写了一个小程序

我使用pyintaller

制作可执行文件

我在窗口中添加了一个自定义图标来替换tkinter的默认羽化图标

from tkinter import *
from tkinter import messagebox
import webbrowser

calculator = Tk()
calculator.title("TBE Calculator")
calculator.resizable(0, 0)
iconFile = 'calculator.ico'

calculator.iconbitmap(default=iconFile)
直接运行program.py文件

时,

图标工作正常

但是当使用

使其可执行时
pyinstaller --onefile --windowed --icon=program.ico program.py

并从dist目录运行program.exe,它出现错误

failed to execute script program

我也试过

pyinstaller --onefile --windowed --icon=program.ico --add-data="calculator.ico;ico" program.py

但仍然是同样的错误。

program.spec 文件

# -*- mode: python -*-

block_cipher = None


a = Analysis(['program.py'],
             pathex=['C:\\Users\\anuj\\PycharmProjects\\YouTubePlayer\\Program'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='calculator',
          debug=False,
          strip=False,
          upx=True,
          console=False , icon='program.ico')

删除行calculator.iconbitmap(default=iconFile)可以正常工作,但使用默认的羽毛图标。

如何使用.exe可执行文件包含窗口图标文件?

2 个答案:

答案 0 :(得分:0)

尝试为您的图标文件提供绝对路径,并通过.ico PyInstaller参数捆绑datas文件。

datas应该是('what_to_bundle.ext', 'there_to_place_it')之类的元组列表(请参阅docs),因此请添加类似

的内容
...
binaries=[],
datas=[('calculator.ico', '.')],
hiddenimports=[],
...

因此,calculator.ico将被放置在您的应用程序的根目录中(然后捆绑到一个文件,pyinstaller创建一个可执行文件,提取临时文件夹中的所有文件,然后像往常一样在双向模式下运行)。 / p>

接下来,您可以使用PyInstaller设置的sys._MEIPASS变量从脚本中找到图标文件的路径(请参阅this excellent answer)。这应该可以解决问题:

import os
import sys
from tkinter import *
from tkinter import messagebox
import webbrowser

calculator = Tk()
calculator.title("TBE Calculator")
calculator.resizable(0, 0)

if getattr(sys, 'frozen', False):
    application_path = sys._MEIPASS
elif __file__:
    application_path = os.path.dirname(__file__)

iconFile = 'calculator.ico'

calculator.iconbitmap(default=os.path.join(application_path, iconFile))
calculator.mainloop()

答案 1 :(得分:0)

我知道已经晚了,但是尝试使用

pyinstaller --onefile --windowed --icon program.ico program.py