如何在tkinter中不使用C:User开头的绝对路径定位本地文件或图片
核心实现思路
你之前的写法用了绑定本地用户目录的绝对路径,其他人电脑不存在该路径就会报错。解决方案是基于脚本本身所在的目录动态拼接路径,只要保持项目内的文件结构不变,不管整个项目放到电脑的哪个位置都能正常读取资源。
方案1:直接用os模块拼接路径(适合纯脚本分发场景)
先固定你的项目文件结构,示例如下:
项目根文件夹/ ├─ main.py(你的tkinter主脚本) └─ Pics/ └─ xxxx.png
对应代码实现:
import os import tkinter as tk window = tk.Tk() # 获取当前脚本所在的绝对目录 current_script_dir = os.path.dirname(os.path.abspath(__file__)) # 自动适配系统拼接图片路径,不用手动写路径分隔符 img_path = os.path.join(current_script_dir, "Pics", "xxxx.png") photo = tk.PhotoImage(file=img_path) label = tk.Label(window, image=photo) label.place(x=0, y=0, relwidth=1, relheight=1) window.mainloop()
- 分发时直接把整个项目根文件夹压缩发给对方,对方解压后运行主脚本即可,不会出现路径错误
- 该写法自动适配Windows、Mac、Linux系统的路径格式
方案2:兼容打包成exe的路径写法
如果后续你需要把程序打包成单exe文件分发,可以用以下兼容写法,同时适配开发环境和打包后的运行环境:
import os import sys import tkinter as tk def get_resource_path(relative_path): # 打包后运行时会进入_MEIPASS临时目录的逻辑,开发时走脚本目录逻辑 if getattr(sys, '_MEIPASS', False): base_path = sys._MEIPASS else: base_path = os.path.dirname(os.path.abspath(__file__)) return os.path.join(base_path, relative_path) window = tk.Tk() # 传入资源的相对路径即可 img_path = get_resource_path(os.path.join("Pics", "xxxx.png")) photo = tk.PhotoImage(file=img_path) label = tk.Label(window, image=photo) label.place(x=0, y=0, relwidth=1, relheight=1) window.mainloop()
- 用pyinstaller打包时需要添加参数把资源文件夹打包进去,Windows系统打包命令为
pyinstaller -F -w --add-data "Pics;Pics" main.py,Mac/Linux系统把命令中的分号替换为冒号即可
内容的提问来源于stack exchange,提问作者PyNoob enthusiast
相关产品推荐
相关产品推荐

