【问题标题】:add ico file to executable in pyinstaller将 ico 文件添加到 pyinstaller 中的可执行文件
【发布时间】:2018-01-19 14:02:18
【问题描述】:

我在python 3.5tkinter写了一个小程序

我正在使用 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 可执行文件中包含窗口图标文件?

【问题讨论】:

    标签: python tkinter python-3.5 pyinstaller


    【解决方案1】:

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

    datas 应该是像('what_to_bundle.ext', 'there_to_place_it') 这样的元组列表(参见docs),所以添加类似

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

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

    接下来,您可以使用 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()
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 2014-12-22
        相关资源
        最近更新 更多