如何将与路径无关的图像加载到python tkinter中,从而使可执行文件与图像路径无关?

时间:2018-10-04 11:56:35

标签: python tkinter icons spyder

我正在spyder 3.2.8中编程; python 3.6使用tkinter。设置我的整个脚本,并使用pyinstaller开发应用程序。

在我的脚本中,我想包含函数iconbitmap('')。问题是一旦执行此操作,我便指定了图像路径,并且在开发应用程序时,将应用程序移至另一台PC时会产生错误。

我知道为什么会发生此错误。这是因为指定的文件路径在新PC上不存在。

我想使用该功能更改小部件图标。它的工作方式就像我在脚本中所说的那样,但是一旦我开发并从一台PC转移到另一台PC上,它就找不到所要查找的图像,从而造成了问题。

这是我要运行的代码的特定部分:

window= tk.Tk()
window.title("Heating Requirement")
window.geometry("650x275")


window.iconbitmap(r'LOGO.ico')

如您所见,它很简单,但与路径有关。

在我的脚本中,它运行完美。 但是,如上所述,问题在于图像与路径有关。

是否有一种方法可以告诉pyinstaller更改iconbitmap而不是在脚本中进行更改,从而使其依赖于路径。...

如果您告诉pyinstaller更改应用程序图标,则它与路径无关,因为它会将映像合并到构建中。我希望pyinstaller也将iconbitimage合并到构建中。

也许有一种外部方式可以更改iconbitimage。在脚本之外是什么意思?

是否可以在tkinter中永久更改iconbitimage?

2 个答案:

答案 0 :(得分:1)

假设您的应用程序位于

/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

现在说您将其复制到朋友bob的计算机上,并且现在拥有

/home/bob/app/script.py

/home/bob/app/image/foo.png

图像仍位于image/foo.png相对位置的script.py相对路径中,因此脚本中的构建路径仍然正确

答案 1 :(得分:0)

所以我知道几个月前我才忘记发布答案:

第一步:编写脚本:

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)

第二:通过pyinstaller运行完成的脚本,并让它创建一个spec文件(在与.py和.spec文件相同的窗口中打开的cmd中):

pyinstaller.exe -f -F program_name.py

第三:在program_name.py脚本下面找到创建的program_name.spec文件,并使用NotePad打开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中):

pyinstaller.exe -f -F program_name.spec