Windows启动文件夹中Python脚本调用PIL/Tkinter异常问题
解决Windows开机启动Pyw脚本无法加载图片的问题
核心问题就是开机启动时当前工作目录不是脚本所在的启动文件夹,而是C:/WINDOWS/System32,导致相对路径找不到图片。你之前改图片加载方式没用,因为本质还是用了相对路径,得改成基于脚本自身位置的绝对路径才能解决。
直接上可行的解决方案:
方法1:用os模块拼接绝对路径
import os import tkinter as tk from PIL import Image, ImageTk # 获取脚本所在的绝对目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接图片的绝对路径 image_path = os.path.join(script_dir, "Image.png") # 初始化全屏置顶窗口 root = tk.Tk() root.attributes("-fullscreen", True) root.attributes("-topmost", True) # 加载并显示图片 img = ImageTk.PhotoImage(Image.open(image_path)) label = tk.Label(root, image=img) label.pack() # 保留图片引用,避免被垃圾回收销毁 label.image = img root.mainloop()
方法2:用pathlib(Python3.4+更简洁)
from pathlib import Path import tkinter as tk from PIL import Image, ImageTk # 获取脚本所在目录的绝对路径 script_dir = Path(__file__).parent.resolve() # 拼接图片路径 image_path = script_dir / "Image.png" root = tk.Tk() root.attributes("-fullscreen", True) root.attributes("-topmost", True) img = ImageTk.PhotoImage(Image.open(image_path)) label = tk.Label(root, image=img) label.pack() label.image = img root.mainloop()
关键说明:
__file__会返回当前pyw脚本的完整绝对路径,不管当前工作目录是什么,都能准确定位到脚本位置。- 必须用
os.path.abspath()或resolve()确保路径是绝对的,避免符号链接、相对层级等问题。 - 必须保留图片对象的引用(比如
label.image = img),否则Tkinter的垃圾回收机制会销毁图片对象,导致窗口显示空白。
至于开机时触发Windows图片查看器的原因,大概率是脚本因找不到图片抛出异常后,Tk窗口的初始化逻辑未执行,系统误将错误路径关联到了默认图片打开程序,解决路径问题后该现象会自然消失。
内容的提问来源于stack exchange,提问作者Hamligt
相关产品推荐
相关产品推荐

