Tkinter Text组件无报错不显示添加的Reddit爬取图片如何解决
问题根因
- 最核心的原因是Tkinter的
PhotoImage对象存在垃圾回收机制的坑:Tkinter组件不会主动持有传入的图片对象引用,如果你把img定义为局部变量,当这段代码所在的函数/方法执行完成后,img没有其他引用就会被Python自动回收,组件上的图片自然就无法显示。 - 次要可能原因是原生
tkinter.PhotoImage对PNG格式的兼容性有限,遇到带透明通道、特殊压缩格式的PNG时容易加载失败,你已经引入了PIL库,直接用PIL的ImageTk模块加载图片会更可靠。
修复方案
你不需要额外保存本地PNG文件,直接把图片对象绑定到类实例上避免被回收即可,修改后的代码如下:
# ImageTk导入建议放在代码文件顶部 from PIL import ImageTk subreddit = reddit.subreddit("MinecraftMemes") filtered = [x for x in subreddit.top() if not x.stickied and not x.is_self] url = filtered[random.randint(0, len(filtered) - 1)].url url_type = self.get_url_type(url) urllib.request.urlretrieve(url,f"minecraft{url_type}") image = Image.open(f"minecraft{url_type}") # 把图片对象绑定到类实例属性上,避免局部变量被回收 self.img = ImageTk.PhotoImage(image) self.text_widget.image_create(END, image=self.img) print("activated")
如果你的场景不允许引入ImageTk,仅用原生PhotoImage的话,只要把局部变量img改成类实例属性self.img即可解决回收问题。
内容的提问来源于stack exchange,提问作者benson chow
相关产品推荐
相关产品推荐

