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
相关产品推荐
相关产品推荐

