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

如何使用Python和Tkinter在Toplevel顶层窗口中显示图片

Tkinter顶层窗口图片显示问题解决方案

问题根源

图片无法显示和顶层窗口特性无关,是Tkinter图片对象垃圾回收机制导致的:你在decrypte函数内定义的img_hdd是局部变量,函数执行结束后该变量会被Python垃圾回收器销毁,而Tkinter控件默认不会持有图片对象的额外引用,因此图片无法正常渲染。

解决方法

只要给图片对象保留一个不会被销毁的引用即可,最常用的方案是将图片对象绑定到使用它的Label控件属性上,修改逻辑如下:

  1. 创建Label控件时不要直接链式调用pack(),先保存控件实例
  2. 给控件新增自定义属性(命名随意,比如.image),把图片对象赋值给这个属性
  3. 再调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:24:03