使用Tkinter显示图片时出现全屏空白窗口问题求助
使用Tkinter显示图片时出现全屏空白窗口问题求助
大家好,我运行下面这段代码的时候没有报错,但窗口是全白的,完全看不到图片。我本来是想让图片全屏显示出来的,而且已经检查过图片本身没有问题。有没有大佬知道这是怎么回事呀?
我的代码如下:
import tkinter as tk from PIL import Image,ImageTk root = tk.Tk() root.attributes('-fullscreen',True) window_width = root.winfo_width() window_height = root.winfo_height() image = Image.open(r"C:\Users\user\OneDrive\Desktop\Proggramers Club\screenshot.png") resized_image = image.resize((window_width, window_height)) photo_image = ImageTk.PhotoImage(resized_image) frame = tk.Frame(root) frame.pack() label = tk.Label(frame, image=photo_image) label.pack() root.mainloop()
问题原因&解决办法
我一眼就看出问题啦!你调用root.winfo_width()和root.winfo_height()的时机不对——在窗口还没完成渲染的时候,这两个方法拿到的不是全屏的真实尺寸,而是Tkinter窗口的默认最小尺寸(通常是1x1或者很小的数值),所以你把图片缩成了这么小的尺寸,放到窗口里自然就看不到了。
这里给你两个可行的解决办法:
方法一:先更新窗口再获取尺寸
在获取宽高之前,先调用root.update()让窗口完成渲染,这样就能拿到真实的全屏尺寸了。修改后的代码如下:
import tkinter as tk from PIL import Image,ImageTk root = tk.Tk() root.attributes('-fullscreen',True) # 先更新窗口,确保拿到真实的全屏尺寸 root.update() window_width = root.winfo_width() window_height = root.winfo_height() image = Image.open(r"C:\Users\user\OneDrive\Desktop\Proggramers Club\screenshot.png") resized_image = image.resize((window_width, window_height)) photo_image = ImageTk.PhotoImage(resized_image) # 直接把Label放在root上,不用嵌套Frame,更简洁 label = tk.Label(root, image=photo_image) label.pack(fill=tk.BOTH, expand=True) # 保留对photo_image的引用,防止被垃圾回收机制回收 label.image = photo_image root.mainloop()
方法二:绑定窗口配置事件动态调整图片
如果你担心后续窗口大小变化(比如退出全屏再进入)图片不能适配,可以绑定<Configure>事件,每次窗口尺寸变化时重新调整图片大小,这个方法更灵活:
import tkinter as tk from PIL import Image,ImageTk root = tk.Tk() root.attributes('-fullscreen',True) # 先加载原始图片 image = Image.open(r"C:\Users\user\OneDrive\Desktop\Proggramers Club\screenshot.png") photo_image = None label = tk.Label(root) label.pack(fill=tk.BOTH, expand=True) def resize_image(event): global photo_image # 获取当前窗口的真实尺寸 window_width = event.width window_height = event.height # 调整图片尺寸 resized_image = image.resize((window_width, window_height)) photo_image = ImageTk.PhotoImage(resized_image) label.config(image=photo_image) label.image = photo_image # 绑定窗口尺寸变化事件 root.bind('<Configure>', resize_image) root.mainloop()
另外还有个小细节:一定要保留对photo_image的引用(比如赋值给label.image),不然Python的垃圾回收机制可能会把图片对象悄悄回收掉,导致窗口还是看不到图片哦!
备注:内容来源于stack exchange,提问作者crazynadge
相关产品推荐
相关产品推荐

