为何Python Tkinter中仅将img设为全局变量时图片才显示?
问题原因解析
这是Tkinter处理图片对象时的引用回收机制导致的:
- Tkinter的图片对象(比如
PhotoImage)依赖Python的变量引用才能存活。如果没有任何Python变量指向它,Python的垃圾回收机制会自动销毁这个图片对象,Tkinter自然没法显示已被销毁的图片。 - 当
img是局部变量时,函数执行完毕后,局部作用域的变量会被销毁,img的引用消失,图片对象也就被回收了——所以Label组件看起来是空的,但因为没有语法错误,程序不会报错。 - 当你把
img声明为全局变量时,函数执行完后,全局变量的引用会一直存在,图片对象不会被垃圾回收,Tkinter就能正常读取并显示图片了。
额外提个替代方案:如果不想用全局变量,也可以把图片对象绑定到Label组件的属性上(比如label.img = img),这样只要Label组件存在,图片对象的引用就不会消失,同样能正常显示。
内容的提问来源于stack exchange,提问作者Raistar Reigns
相关产品推荐
相关产品推荐

