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

Tkinter中Toplevel()窗口按钮设置图片图标失败问题咨询

解决Tkinter Toplevel窗口按钮不显示图片的问题

嘿,这是Tkinter里超常见的PhotoImage垃圾回收坑!我一眼就看出问题所在了。

你在mainpage()函数里创建的new_img、sea_img这些PhotoImage对象都是局部变量,当函数执行完毕后,Python的垃圾回收机制会把这些不再被引用的对象清理掉。虽然按钮控件一开始指向了这些图片,但控件本身并没有持有图片对象的强引用,所以图片被回收后,按钮自然就显示不出东西了。而主窗口的图片没问题,是因为root是全局变量,相关资源不会被轻易回收。

给你两种简单的解决方案,随便选一种都能搞定:

方案1:把图片绑定到Toplevel窗口对象上

直接把图片对象设为Toplevel窗口的属性,让窗口持有引用,这样函数结束后图片也不会被回收:

from tkinter import *

root = Tk()
root.title("Login Window")
root.geometry("300x300")

def mainpage():
    mp = Toplevel()
    mp.title("Main Page")
    
    # 把图片绑定到Toplevel窗口的属性上
    mp.new_img = PhotoImage(file="nen.png")
    mp.sea_img = PhotoImage(file="serch.png")
    mp.al_img = PhotoImage(file="shw.png")
    
    Button(mp, image=mp.new_img).pack(side="top", pady=0)
    Label(mp, text="New Entry", bd=0).pack(side="top", padx=0)
    # 其他按钮同理使用mp.sea_img、mp.al_img

root.mainloop()

方案2:把图片绑定到按钮自身的属性上

如果不想把图片挂在窗口上,也可以直接绑定到对应的按钮对象:

from tkinter import *

root = Tk()
root.title("Login Window")
root.geometry("300x300")

def mainpage():
    mp = Toplevel()
    mp.title("Main Page")
    
    new_img = PhotoImage(file="nen.png")
    new_btn = Button(mp, image=new_img)
    # 把图片绑定到按钮的属性
    new_btn.image = new_img
    new_btn.pack(side="top", pady=0)
    
    Label(mp, text="New Entry", bd=0).pack(side="top", padx=0)
    
    # 搜索按钮示例
    sea_img = PhotoImage(file="serch.png")
    sea_btn = Button(mp, image=sea_img)
    sea_btn.image = sea_img
    sea_btn.pack(side="left", padx=10)

root.mainloop()

两种方法核心都是让图片对象有一个不会被轻易销毁的引用,只要避免局部变量被回收,图片就能正常显示在Toplevel的按钮上啦。

内容的提问来源于stack exchange,提问作者suraj pal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:17:30