Python3.8|Python3.8 + Tkinter: Button设置image属性不显示的问题及解决方法
Bug如题目所描述。尝试过将按钮的image指向的变量del_icon设置为global全局变量,但是不成功,会提示如“
【Python3.8|Python3.8 + Tkinter: Button设置image属性不显示的问题及解决方法】AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'”的错误。代码1是导致bug的源头。
代码1:
#!/bin/env python3from PIL import ImageTkimport tkinter as tk...self.del_button = tk.Button(self.frame, text='DEL', width=20, height=20)self.del_button.config(image=ImageTk.PhotoImage(resize(os.getcwd() + '/delete.png', 0)))self.del_button.bind('', self.delete_selected_image)self.del_button.grid(row=0, column=0, sticky=tk.W)
文章图片
结果删除按钮不显示image,按钮上显示空白:
文章图片
del_button的image不显示
尝试将del_button的image指向的变量设置为局部变量,即下面所展示的代码2。
代码2:
#!/bin/env python3from PIL import ImageTkimport tkinter as tk...self.del_button = tk.Button(self.frame, text='DEL', width=20, height=20)del_icon = ImageTk.PhotoImage(resize(os.getcwd()+'/delete.png', 0))self.del_button.config(image=del_icon)self.del_button.bind('', self.delete_selected_image)self.del_button.grid(row=0, column=0, sticky=tk.W)
文章图片
结果删除按钮的image显示正常:
文章图片
del_button的image显示正常
笔记:
不明所以的bug。判断潜在原因是:GC的问题。image属性需要指向明确的内存地址。方法返回的临时变量地址调用后即被回收,导致image指向空地址。
resize()的代码:
#!/bin/env python3from PIL import Image def resize(path):image = Image.open(path)raw_width, raw_height = image.size[0], image.size[1]min_height = 20min_width = int(raw_width * min_height / raw_height)return image.resize((min_width, min_height))
到此这篇关于Python3.8 + Tkinter: Button设置image属性不显示的问题的文章就介绍到这了,更多相关Python Tkinter按钮不显示内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- UIbutton防止重复点击
- iOS|iOS 响应者及响应者链
- SDWebImage
- UIButton:|UIButton: 巧妙封装截获响应
- SwiftUI|SwiftUI Button监听点击和释放消息 实现照片切换 (教程含源码 技术大全)
- Python|Python GUI编程(Tkinter)
- gui编程|GUI 图形用户界面编程(四)-Button组件
- iOS|iOS UIButton设置button上的文字和图片
- Python + Tkinter简单实现注册登录(连接本地MySQL数据库)
- buttons.css——可以与bootstrap融合的按钮样式库