【问题标题】:How to load a path independent image into python tkinter making the executable independent from the image path?如何将独立于路径的图像加载到 python tkinter 中,使可执行文件独立于图像路径?
【发布时间】:2019-03-09 19:24:22
【问题描述】:

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

在我的脚本中,我想包含函数iconbitmap('')。问题是,一旦我这样做了,我指定了一个图像路径,当我开发应用程序时,当我将应用程序移动到另一台 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?

【问题讨论】:

  • 是否可以将它们放在相对于脚本的固定位置?
  • @FlyingTeller 目的是在多台电脑上使用程序,所以没有固定位置。
  • 关键是相对一词。绝对路径是可以改变的,只要你有一个固定的图片相对路径

标签: python tkinter icons spyder


【解决方案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

现在说你把它复制到你朋友鲍勃的电脑上,现在有了

/home/bob/app/script.py

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

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

【讨论】:

  • 可以的。但总有可能有人删除包含图像的附加文件夹。因此使程序有缺陷。
  • 但这适用于任何程序。如果您进入C:/Program files/ 并开始删除内容,那么如果您的某些程序不再工作,那就不足为奇了
  • 是的。但我想知道是否有办法在程序构建中生成图像而不是在相关文件中运行它
  • 所以您正在寻找pyinstaller 选项--add-data?
  • 如果我创建一个桌面快捷方式,它就不再有用了
【解决方案2】:

所以几个月前我才发现只是忘了发布答案:

第一步:写入脚本::

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文件,用记事本打开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

【讨论】:

  • 兄弟,你是救命稻草
猜你喜欢
  • 2017-05-18
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多