如何将路径独立的映像加载到python tkinter中,使可执行文件独立于映像路径?
我正在用spyder 3.2.8进行编程<代码>python 3.6使用如何将路径独立的映像加载到python tkinter中,使可执行文件独立于映像路径?,python,tkinter,icons,spyder,Python,Tkinter,Icons,Spyder,我正在用spyder 3.2.8进行编程python 3.6使用tkinter。设置我的整个脚本并使用pyinstaller开发应用程序 在我的脚本中,我想包含函数iconbitmap(“”)。问题是,一旦我这样做,我就指定了一个映像路径,当我开发应用程序时,当我将应用程序移动到另一台PC时,它会产生一个错误 我知道为什么会发生这种错误。这是因为新电脑上不存在指定的文件路径 我想用该功能更改小部件图标。它的工作原理与我在脚本中所说的一样,但一旦我开发并从一台电脑转移到另一台电脑,它就找不到有问题
tkinter
。设置我的整个脚本并使用pyinstaller开发应用程序
在我的脚本中,我想包含函数iconbitmap(“”)
。问题是,一旦我这样做,我就指定了一个映像路径,当我开发应用程序时,当我将应用程序移动到另一台PC时,它会产生一个错误
我知道为什么会发生这种错误。这是因为新电脑上不存在指定的文件路径
我想用该功能更改小部件图标。它的工作原理与我在脚本中所说的一样,但一旦我开发并从一台电脑转移到另一台电脑,它就找不到有问题的图像,因此产生了问题
这是我试图运行的代码的特定部分:
window= tk.Tk()
window.title("Heating Requirement")
window.geometry("650x275")
window.iconbitmap(r'LOGO.ico')
正如您所看到的,它很简单,但依赖于路径
在我的脚本中,它运行得非常完美。
然而,问题如上所述,图像依赖于路径
有没有一种方法可以告诉pyinstaller更改iconbitmap,而不是在脚本中进行更改,这会使它依赖于路径
如果您告诉pyinstaller更改应用程序图标,则它不依赖于路径,因为它将映像合并到构建中。我希望pyinstaller也将iconbitimage合并到构建中
是否有一种外部方法可以更改iconbitimage。剧本之外的意思
有没有办法永久更改tkinter中的图标图标 假设你的应用程序在
/home/aston/app/script.py
然后你可以把图像放进
/home/aston/app/images/foo.png
并从脚本中将其引用为
import os
dirname = os.path.dirname(__file__)
os.path.join(dirname, "image", "foo.png")
它将采用当前脚本的路径并附加image/foo.png
现在假设你把它复制到你朋友鲍勃的电脑上
/home/bob/app/script.py
及
图像仍然在路径
image/foo.png
中,相对于script.py
的位置,因此脚本中构建的路径仍然是正确的,所以几个月前我就知道了,只是忘了发布答案:
第一步:在脚本中写入:
def resource_path(relative_path):
#""" Get absolute path to resource, works for dev and for PyInstaller """
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
image_path = resource_path("LOGO.ico")
window= tk.Tk()
window.iconbitmap(image_path)
Seconly:通过pyinstaller运行完成的脚本,并让它创建一个spec文件(在cmd中,与.py和.spec文件在同一窗口中打开):
第三:在program_name.py脚本下面找到创建的program_name.spec文件,并用记事本打开program_name.spec
第四:现在将下面的信息复制并粘贴到规范文件中,并更改必要的信息
# -*- mode: python -*-
a = Analysis(['C:\\Users\\Aston
\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\program_name.py'],
pathex=['C:\\Users\\Aston
\\AppData\\Local\\Programs\\Python\\Python36\\Scripts'],
hiddenimports=[],
hookspath=None)
a.datas += [ ('image_name.ico', 'C:\\Users\\Aston
\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\Image_name.ico', 'DATA')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name=os.path.join('dist', 'What ever you want to name program.exe'),
debug=False,
strip=None,
upx=True,
console=False , icon='C:\\Users\\Aston\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\image_name.ico')
记住保存等级库文件
第五:现在再次运行pyinstaller,但这次使用(在与.py和.spec文件在同一窗口中打开的cmd中):
将它们放在相对于脚本的固定位置是一种选择吗?@FlyingTeller目标是在多台计算机上使用该程序,因此没有固定位置。关键是术语相对。绝对路径可以改变,只要你有一个固定的图像相对路径可以工作是的。但总有可能有人删除包含该图像的附加文件夹。因此使程序有缺陷,但对任何程序都是如此。如果你进入
C:/Program files/
并开始删除内容,那么如果你的一些程序不再工作,那就没有什么奇怪的了是的。但是我想知道是否有一种方法可以在程序构建中生成映像,而不是在相关文件中运行映像。您正在寻找pyinstaller
选项--添加数据
?如果我创建桌面快捷方式,它就没有用了。Bro您是一个救生员
pyinstaller.exe -f -F program_name.py
# -*- mode: python -*-
a = Analysis(['C:\\Users\\Aston
\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\program_name.py'],
pathex=['C:\\Users\\Aston
\\AppData\\Local\\Programs\\Python\\Python36\\Scripts'],
hiddenimports=[],
hookspath=None)
a.datas += [ ('image_name.ico', 'C:\\Users\\Aston
\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\Image_name.ico', 'DATA')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name=os.path.join('dist', 'What ever you want to name program.exe'),
debug=False,
strip=None,
upx=True,
console=False , icon='C:\\Users\\Aston\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\image_name.ico')
pyinstaller.exe -f -F program_name.spec