Tkinter如何将普通按钮替换为可正常触发点击的图片样式
问题根源&修改要点
- 你使用的参数错误:Tkinter Button控件设置背景图片的参数是
image,不是你尝试的img,bg参数仅用于设置纯色背景,无法传入图片对象。 - 存在Tkinter图片垃圾回收坑:PhotoImage创建的图片对象如果没有被持久引用,会被Python垃圾回收机制自动清理,导致界面上图片显示为空白/极小标识,不会有任何报错。
- 不需要额外设置固定宽高:如果用图片作为按钮载体,设置固定
height/width会按字符大小计算控件尺寸,反而挤压图片显示空间。
修改后完整代码
import tkinter as tk from PIL import ImageTk, Image from subprocess import Popen ##Application Window: root=tk.Tk() root.title("Virtual Desktop") root.resizable(False, False) #Determine Window Resolution canvas = tk.Canvas(root, width=1280, height=780, bg="#263D42") canvas.pack() #Importing Calulator Image path = r"C:\Pictures\CalcLogo.png" # 加r前缀避免路径转义符问题 img = Image.open(path) img = img.resize((96, 96), Image.Resampling.LANCZOS) # 高版本PIL用LANCZOS替代ANTIALIAS,兼容旧版本可以换回ANTIALIAS img = ImageTk.PhotoImage(img) #Calculator Button def openCalc(): Popen("calc.exe") # 核心修改:传入image参数,不需要文字可以删掉text参数 openCalcWin = tk.Button( text='Calculator', # 不需要文字可以删除这行 command=openCalc, bg="Grey", image=img, compound=tk.CENTER # 文字叠加在图片中央,不需要文字可以删除这行 ) # 把图片对象绑定到按钮实例,防止被垃圾回收 openCalcWin.img = img canvas.create_window(1167,714, window=openCalcWin) root.mainloop()
额外说明
- 路径前面加
r前缀可以避免Windows路径里的反斜杠被识别为转义符导致图片读取失败。 - 如果你使用的是Pillow 9.1.0以下版本,直接把
Image.Resampling.LANCZOS换回Image.ANTIALIAS即可,效果完全一致。 - 如果不需要显示文字,直接删掉
text和compound两个参数即可,按钮会完全显示为你导入的图片样式,点击功能正常触发。
内容的提问来源于stack exchange,提问作者BartSimpson
相关产品推荐
相关产品推荐

