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

如何在Python Tkinter中实现圆角按钮并修改背景色,解决CustomButton未定义报错

报错原因

你遇到的NameError: name 'CustomButton' is not defined报错,是因为Tkinter原生没有内置CustomButton组件,这个类需要自行实现或者引入第三方库才能调用。

优先无类实现方案(适配你现有代码)

你已经在代码中创建了Canvas组件,完全可以直接在Canvas上绘制圆角按钮,不需要额外定义类,步骤如下:

  1. 先添加一个绘制圆角按钮的通用函数,放到你的sortear函数之前即可:
def create_round_button(canvas, x, y, width, height, radius, bg_color, text, text_color, command):
    # 绘制圆角矩形四个角的圆弧
    points = [
        x+radius, y,
        x+width-radius, y,
        x+width, y+radius,
        x+width, y+height-radius,
        x+width-radius, y+height,
        x+radius, y+height,
        x, y+height-radius,
        x, y+radius
    ]
    # 绘制圆角背景
    btn_bg = canvas.create_polygon(points, smooth=True, fill=bg_color, outline=bg_color)
    # 绘制按钮文字
    btn_text = canvas.create_text(x+width/2, y+height/2, text=text, fill=text_color, font=("Roboto", 12))
    
    # 绑定点击事件
    def on_click(event):
        # 点击反馈效果,颜色可自行调整
        canvas.itemconfig(btn_bg, fill="#d03030")
        canvas.update()
        canvas.after(100, lambda: canvas.itemconfig(btn_bg, fill=bg_color))
        command()
    
    canvas.tag_bind(btn_bg, "<Button-1>", on_click)
    canvas.tag_bind(btn_text, "<Button-1>", on_click)
    return btn_bg, btn_text
  1. 删掉你原来报错的button = CustomButton(window, 100, 25, 'red')、btnSorte = canvas1.create_oval()以及普通Button定义的三行代码,替换为调用上面的函数即可:
# 参数可自行调整:画布、左上角x坐标、左上角y坐标、宽、高、圆角半径、背景色、文字、文字色、点击回调
create_round_button(canvas1, 1100, 500, 120, 35, 8, "red", "Sortear", "white", sortear)

自定义类实现方案(方便复用)

如果需要多处使用圆角按钮,可以封装CustomButton类,实现方法如下:

class CustomButton(tk.Canvas):
    def __init__(self, parent, width, height, bg_color, text="", text_color="white", command=None, radius=8):
        super().__init__(parent, width=width, height=height, bd=0, highlightthickness=0, bg=parent["bg"])
        self.command = command
        self.bg_color = bg_color
        # 绘制圆角轮廓
        points = [
            radius, 0,
            width-radius, 0,
            width, radius,
            width, height-radius,
            width-radius, height,
            radius, height,
            0, height-radius,
            0, radius
        ]
        self.bg = self.create_polygon(points, smooth=True, fill=bg_color, outline=bg_color)
        self.text = self.create_text(width/2, height/2, text=text, fill=text_color, font=("Roboto", 12))
        # 绑定点击事件
        self.bind("<Button-1>", self.on_click)
    
    def on_click(self, event):
        self.itemconfig(self.bg, fill="#d03030")
        self.update()
        self.after(100, lambda: self.itemconfig(self.bg, fill=self.bg_color))
        if self.command:
            self.command()

调用方式和你之前写的逻辑一致:

button = CustomButton(window, 100, 25, 'red', text="Sortear", command=sortear)
button.place(x=1100, y=500)

内容的提问来源于stack exchange,提问作者Gaby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:27:03