我已经从python tkinter GUI成功创建了一个包含图像的EXE文件。请参阅以下代码:
lblLogo=Label(main)
lblLogo.grid(row=3,column=11,rowspan=4)
try:
filelocation="C:/Documents/Python/ScreenPartNumberProgram/"
KasonLogo=PhotoImage(file=filelocation+"KasonLogo.png")
KasonLogo=KasonLogo.zoom(25,20)
KasonLogo=KasonLogo.subsample(50,50)
lblLogo.config(image=KasonLogo)
icon=PhotoImage(file=filelocation+"KasonLogo.png")
main.tk.call('wm','iconphoto',main._w,icon)
except:
print("warning: could not load photos")
lblLogo.config(text="[KasonLogo.png]")
exe文件打开并在我的计算机上完美运行。我使用此命令获取.exe:
pyinstaller --onefile --noconsole myscript.py
唯一的问题是此文件要求图像位于同一文件夹中,或者标签上没有显示。如何在不需要外部文件的情况下将图像捆绑到EXE中?
提前致谢
编辑: 我查看了提供的链接,做了更多的研究,但仍然没有解决问题。仅当图像位于同一文件夹中时,该程序才有效。我真的很想让它工作而不需要外部图像文件。 resource_path技术似乎对我不起作用......
我也尝试修改我的代码以使用PIL的ImageTk和同样的问题。仅当外部图像文件位于包含它的文件夹中时,程序才会加载图像。
答案 0 :(得分:1)
HOLY COW!经过几天的头痛之后,我终于找到了一种有效的方法......这就是我在不需要外部图像文件的情况下让程序工作的方法:
步骤1:对图像文件进行编码(请注意,它必须是GIF。您可以使用油漆转换它):
import base64
with open("MyPicture.gif", "rb") as image_file:
encoded_string = base64.b64encode(image_file.read())
print(encoded_string)#print string to copy it (see step 2)
第2步:下一步是将字符串复制并粘贴到单独的myimages.py文件中 将其存储为变量。例如:
imageString = b'R0lGODlhyADIAPcAAAA .....blah blah really long string.......'
步骤3:然后将myimages.py导入主程序并调用变量
from myimages import *
pic=imageString#GIF decoded to string. imageString from myimages.py
render = PhotoImage(data=pic)
myLabel.config(image=render)
步骤4:在spec文件中:将myimages.py包含为数据
# -*- mode: python -*-
block_cipher = None
#instructions: pyinstaller --onefile --noconsole myProgram.spec
file_name = 'myProgram'
add_files=[('myimages.py','module')]
a = Analysis([file_name+'.py'],
pathex=['C:\\Program Files (x86)\\Python36-32\\Scripts'],
binaries=[],
datas=add_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=exclude_list,
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=file_name,
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=False )
第5步:最后你可以编译成EXE:
pyinstaller --onefile --noconsole myProgram.spec
SIGH 如果有人有更好的解决方案,请在此处发布。在那之前,我很高兴有些事情有效......
答案 1 :(得分:0)
当我想包含一个.ico文件用作tkinter应用程序的图标时,我遇到了同样的问题。这是我的工作方式:
使用PyInstaller构建.exe文件时,我指定了--add-data选项以及.ico的完整路径。
应用程序启动时,必须将.exe中的所有内容解压缩到临时目录中,因此我获得了该临时目录的路径,并使用它指定我的.ico文件的临时位置。 / p>
在启动主循环之前,使用“ tempfile”获取临时文件目录,并使用“ glob”检查文件模式是否匹配:
tempdir = tempfile.gettempdir()
icon_path = tempdir + '\\' + 'next_subdirectory_pattern' + '\\' + '*.ico'
icon_matches = glob.glob(icon_path)
if len(icon_matches) > 0:
logo = icon_matches[0]
else:
logo = ''
tk.Tk.iconbitmap(self, default=logo)
可能不是最雄辩的方法,但它有效。
答案 2 :(得分:0)
我是这样做的...
要将映像与可执行文件捆绑在一起:
使用以下命令将您的图标保存到名为“icon”的文件夹中,该文件夹将在 pyinstaller 在运行时生成的“C:\Users
--add-data=C:\absolute\path\to\your\ICON.ico;icon
我的完整命令行,我在 python 终端中输入的字符串(我使用的是 pycharm IDE)以生成我的 EXE,如下所示:
pyinstaller -w -F -i=C:\absolute\path\to\your\ICON.ico --add-data=C:\absolute\path\to\your\ICON.ico;icon -n=MyEXEsNameV1 main.py
(对于调试,省略 -w 并添加 --debug=all 很有帮助)
文档参考:https://pyinstaller.readthedocs.io/en/stable/usage.html#options-group-what-to-bundle-where-to-search
在我的 python 脚本 main.py 中访问图像:
我使用以下代码来设置 tk 窗口:
import tkinter as tk
from os import path
# main widget
self.root = tk.Tk(master)
self.root.title('Window Title Bar Name V1.0')
self.root.minsize(1234, 1234)
# get icon
try:
# Get the absolute path of the temp directory
path_to_icon = path.abspath(path.join(path.dirname(__file__), 'icon/GAUGE-ICON.ico'))
# set the icon of the tk window
self.root.iconbitmap(path_to_icon)
except:
pass
文档参考:https://pyinstaller.readthedocs.io/en/stable/runtime-information.html