Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将路径独立的映像加载到python tkinter中,使可执行文件独立于映像路径?_Python_Tkinter_Icons_Spyder - Fatal编程技术网

如何将路径独立的映像加载到python tkinter中,使可执行文件独立于映像路径?

如何将路径独立的映像加载到python tkinter中,使可执行文件独立于映像路径?,python,tkinter,icons,spyder,Python,Tkinter,Icons,Spyder,我正在用spyder 3.2.8进行编程python 3.6使用tkinter。设置我的整个脚本并使用pyinstaller开发应用程序 在我的脚本中,我想包含函数iconbitmap(“”)。问题是,一旦我这样做,我就指定了一个映像路径,当我开发应用程序时,当我将应用程序移动到另一台PC时,它会产生一个错误 我知道为什么会发生这种错误。这是因为新电脑上不存在指定的文件路径 我想用该功能更改小部件图标。它的工作原理与我在脚本中所说的一样,但一旦我开发并从一台电脑转移到另一台电脑,它就找不到有问题

我正在用spyder 3.2.8进行编程<代码>python 3.6使用
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