You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:06:02