为何未赋值的tkinter PhotoImage无法创建,而Widget却可以?
为什么Tkinter里没赋值给变量的Widget能留着,PhotoImage却没了?
一、Widget(比如Label)能保留的原因
创建Tkinter Widget(像tk.Label())的时候,这个组件会自动绑定到父容器(默认是root)上,父容器的children字典会一直持有这个Widget的引用。哪怕你没把它赋值给Python变量,只要父容器还在,就有个有效的引用指着它,Python的垃圾回收器不会把它删掉,所以你在root.children里能看到所有创建的Label,包括没赋值的那些。
二、PhotoImage被销毁的原因
PhotoImage是Tkinter的图像对象,它不会自动被父容器持有引用。当你写tk.PhotoImage(name="not_assign1")这种没赋值给变量的代码时,语句执行完,这个PhotoImage在Python里就没人“惦记”它了——没有任何变量指着它。Python的垃圾回收机制会立刻把这个无主对象回收掉,对应的Tkinter图像资源也会被释放,所以root.image_names()里根本找不到这些没被赋值的PhotoImage。
只有那些被赋值给变量(比如im = tk.PhotoImage())的PhotoImage,因为变量一直指着它,垃圾回收器不敢动它,所以图像资源能保留下来,在root.image_names()里能查到。
内容的提问来源于stack exchange,提问作者Danya K
相关产品推荐
相关产品推荐

