如何将无背景图片设置为Tkinter按钮图标?
如何将无背景图片设置为Tkinter按钮图标?
我正在使用Tkinter制作GUI界面,界面上有若干点击后可执行对应功能的按钮图标,例如截图功能按钮的代码:
def screenshot(): # root.iconify() myScreentshot=pyautogui.screenshot() file_path=filedialog.asksaveasfilename(defaultextension='.png') myScreentshot.save(file_path) screenshot_image = tk.PhotoImage(file='images/app6.png') screenshot = tk.Button(root,image=screenshot_image,bg='#0000CD',command=screenshot) screenshot.place(x=640,y=500)
目前遇到的问题是:将图片作为按钮图标使用时,总会带有方形或矩形背景;即便将按钮bg属性设置为与主界面相同的颜色,仍能看到该背景。请问如何仅显示图片本身的形状,去除其背景?
问题示例图:
解决方法
要让Tkinter按钮只显示无背景图片,需要从图片处理和按钮属性设置两方面入手:
- 用PIL库处理透明图片(推荐)
原生Tkinter的PhotoImage对PNG的alpha通道支持有限,用PIL的Image和ImageTk能完美加载带透明背景的图片:
首先安装PIL(Pillow):
pip install pillow
然后修改代码:
from PIL import Image, ImageTk # 加载并处理透明图片 image = Image.open('images/app6.png') screenshot_image = ImageTk.PhotoImage(image) # 创建按钮时设置关键属性 screenshot = tk.Button( root, image=screenshot_image, bg='#0000CD', # 和主界面背景色一致 command=screenshot, relief='flat', # 去掉按钮凸起/凹陷样式 borderwidth=0, # 去掉按钮边框宽度 highlightthickness=0, # 去掉按钮获得焦点时的高亮边框 activebackground='#0000CD' # 点击时的背景色也设为主界面色 ) screenshot.place(x=640,y=500) # 注意:要保留对图片对象的引用,防止被GC回收 screenshot.image = screenshot_image
- 原生Tkinter的透明设置(仅针对纯色背景的图片)
如果你的图片是纯色背景(比如白色),可以用PhotoImage的transparentcolor参数指定要透明的颜色:
screenshot_image = tk.PhotoImage(file='images/app6.png', transparentcolor='white') # 同样要设置按钮的relief、borderwidth等属性 screenshot = tk.Button( root, image=screenshot_image, bg='#0000CD', command=screenshot, relief='flat', borderwidth=0, highlightthickness=0 ) screenshot.place(x=640,y=500) screenshot.image = screenshot_image
关键注意点:
- 必须保留对图片对象的引用(比如
screenshot.image = screenshot_image),否则Python的垃圾回收会把图片销毁,按钮上就看不到图片了。 - 按钮的
relief设为flat、borderwidth和highlightthickness设为0,能彻底去掉按钮本身的边框和背景样式,只显示图片。
内容的提问来源于stack exchange,提问作者Payam
相关产品推荐
相关产品推荐

