You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:24:04