PIL库PhotoImage对象在Tkinter界面无法显示问题求助
问题根因与修复方案
你代码里的垃圾回收规避逻辑完全正确,图片不显示是两个低级写法错误导致的,和GC无关:
问题1:标签页内容帧父容器错误
你在add_to_notebook方法中创建标签页内容帧时,错误将父容器指定为主窗口,而非notebook控件本身,导致所有图片被放到了不可见的游离帧上,notebook的每个标签都是空的。
修复代码:
def add_to_notebook(self, name, name_frame, config_args=None, grid_args=None): if grid_args is None: grid_args = {} if config_args is None: config_args = {} # 把父容器从self改成self.l_widgets[name][0](也就是notebook控件) self.frames[name_frame] = ttk.Frame(self.l_widgets[name][0]) self.l_widgets[name][0].add(self.frames[name_frame], **config_args) self.l_widgets[name][0].grid(**grid_args)
问题2:Label控件未指定显示的图片
你仅把图片引用挂载到了Label的image属性上做GC规避,但没有在config方法中传入image参数告知Label要渲染这张图,Label默认只显示空文本。
修复代码:
def create_a_label_with_an_image(self, name, filename, size=(None, None), config_args=None, grid_args=None, frame="main"): global immortals if grid_args is None: grid_args = {} if config_args is None: config_args = {} immortals[name] = ImagePersistent(filename, size).image self.l_widgets[name] = (ttk.Label(self.frames[frame]), immortals[name]) # config时新增image参数指定要显示的图片 self.l_widgets[name][0].config(image=immortals[name], **config_args) self.l_widgets[name][0].image = immortals[name] self.l_widgets[name][0].grid(**grid_args)
可选优化
你初始化时定义self.images = []是列表,但add_image方法中把它当字典用self.images[name] = image,如果后续要用到这个方法,建议改成字典初始化:
self.images = {}
修改完成后直接运行即可正常显示所有图片。
内容的提问来源于stack exchange,提问作者Nolann Boyere
相关产品推荐
相关产品推荐

