pyinstaller 单个 EXE 文件 - tkinter 主窗口标题中的 ico 图像

pro*_*bat 6 python exe tkinter pyinstaller

我在 Stack Overflow 上找到了一些关于此的信息,并一直在尝试,但它对我不起作用。我需要社区的帮助:)

正如标题所示,我想将 *.ico 添加到我的 tkinter 窗口中。问题是当使用 pyinstaller 创建单个 EXE 文件时,这不是很直接。下面正是我根据 Stack Overflow 上收集的信息实现的。在 64 位机器上使用 Python 3.5。

我的脚本的名称是calculator.py ico的名称是calculator.ico

1. 我将以下代码行添加到我的 Python 脚本中:

import os
import sys

datafile = "calculator.ico"
if not hasattr(sys, "frozen"):
    datafile = os.path.join(os.path.dirname(__file__), datafile)
else:
    datafile = os.path.join(sys.prefix, datafile)


window = tkinter.Tk()
window.iconbitmap(default=datafile)
Run Code Online (Sandbox Code Playgroud)

2a. 然后,我使用以下命令使用 pyinstaller 构建了单个 EXE 文件:

pyinstaller -w -F -i "C:\PythonProjects\Calc\calculator.ico" calculator.py
Run Code Online (Sandbox Code Playgroud)

2b. 我还尝试使用以下命令构建我的单个 EXE 文件,看看它是否有帮助:

pyinstaller --onefile --windowed --icon=calculator.ico calculator.py
Run Code Online (Sandbox Code Playgroud)

3. pyinstaller 构建单个 EXE 文件后,我向 *.spec 文件添加了一些内容 - 下面是包含添加内容的完整 *.spec 文件:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['calculator.py'],
             pathex=['C:\\PythonProjects\\calc'],
             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 + [('caclulator.ico', 'C:\\PythonProjects\\calc\\calculator.ico', 'DATA')],
          a.zipfiles,
          a.datas,
          name='calculator',
          debug=False,
          strip=False,
          upx=True,
          console=False , icon='calculator.ico')
Run Code Online (Sandbox Code Playgroud)

我将以下内容添加到 exe = EXE:

+ [('caclulator.ico', 'C:\\PythonProjects\\calc\\calculator.ico', 'DATA')]
Run Code Online (Sandbox Code Playgroud)

将上述内容添加到spec文件后,我运行了以下命令。

pyinstaller calculator.spec
Run Code Online (Sandbox Code Playgroud)

重建 EXE 后,我运行 EXE 文件并收到以下错误消息:

  • 无法执行脚本计算器

提前致谢!

小智 2

你做的一切都是对的。但你刚刚错过了最后一步。在您的代码中添加以下几行,它应该可以工作。

def resource_path(relative_path):    
try:       
    base_path = sys._MEIPASS
except Exception:
    base_path = os.path.abspath(".")

return os.path.join(base_path, relative_path)
Run Code Online (Sandbox Code Playgroud)

然后调用这个。

window.iconbitmap(default=resource_path(datafile))
Run Code Online (Sandbox Code Playgroud)