如何使用Python和Tkinter在Toplevel顶层窗口中显示图片
Tkinter顶层窗口图片显示问题解决方案
问题根源
图片无法显示和顶层窗口特性无关,是Tkinter图片对象垃圾回收机制导致的:你在decrypte函数内定义的img_hdd是局部变量,函数执行结束后该变量会被Python垃圾回收器销毁,而Tkinter控件默认不会持有图片对象的额外引用,因此图片无法正常渲染。
解决方法
只要给图片对象保留一个不会被销毁的引用即可,最常用的方案是将图片对象绑定到使用它的Label控件属性上,修改逻辑如下:
- 创建Label控件时不要直接链式调用
pack(),先保存控件实例 - 给控件新增自定义属性(命名随意,比如
.image),把图片对象赋值给这个属性 - 再调用
pack()渲染控件
修改后的代码示例
import tkinter from tkinter import ttk from PIL import Image, ImageTk def decrypte(): style = ttk.Style() style.theme_use("alt") style.configure("green.Horizontal.TProgressbar", foreground='green', background='green') decrypte_window = tkinter.Toplevel(root) decrypte_window.title("Decrypt your files") decrypte_window.geometry("900x700") area_decrypte = tkinter.Frame(decrypte_window, bg="black", width=900, height=400) area_decrypte.pack() area_decrypte.pack_propagate(False) img_hdd = ImageTk.PhotoImage(Image.open('hdd.png')) # 以下是修改部分 hdd_label = tkinter.Label(area_decrypte, image=img_hdd, width=100, height=100) hdd_label.image = img_hdd # 绑定图片引用,避免被垃圾回收 hdd_label.pack() def block_all(): global root # 原代码background为None,作为父容器会报错,改为root decrypt = tkinter.Button(root, text="Decrypt", width=14, height=2, command=decrypte, bg="#0078FF", foreground="#fff").pack(side="right", anchor="se", pady=30, padx=60) root.mainloop() root = tkinter.Tk() root.geometry("1100x900") background = None block_all()
其他可选方案
- 用
global关键字将图片对象声明为全局变量,避免局部回收 - 如果你是用类封装GUI逻辑,直接将图片对象设为类实例属性即可
内容的提问来源于stack exchange,提问作者Dkns
相关产品推荐
相关产品推荐

