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

如何用CustomTkinter实现圆角按钮鼠标悬停时背景变色?

解决CustomTkinter圆角按钮悬停切换背景色的问题

问题分析

你的代码存在以下几个问题:

  • 语法错误:<Enter>绑定的lambda表达式中,fg_color="#00EC00"被错误地放在lambda函数外部,导致代码直接报错。
  • 逻辑冲突:同时使用CTkButton内置的hover_color属性和手动绑定<Enter>/<Leave>事件,两者互相干扰导致hover_color不生效。
  • 属性误用:bg_color是用来设置按钮父容器的背景色,而非按钮自身背景,使用它会破坏圆角效果;CTkButton的按钮背景色需要通过fg_color控制。

修复方案

方案1:使用CTkButton内置的hover功能(推荐)

利用组件自带的属性实现悬停效果,代码更简洁:

from customtkinter import CTk, CTkButton

def inputscreen():
    # 此处添加inputscreen函数的具体实现
    pass

main = CTk()

start_button = CTkButton(
    main, 
    text="Start",
    command=inputscreen,
    corner_radius=50,
    height=50,
    width=70,
    fg_color="#FFFFFF",       # 默认按钮背景色
    text_color="#00EC00",     # 默认文字颜色
    hover_color="#00EC00",    # 悬停时按钮背景色
    text_color_hover="white"  # 悬停时文字颜色
)
start_button.pack()  # 将按钮添加到窗口(原代码缺失此步骤)

main.mainloop()

方案2:手动绑定事件(适合需要自定义复杂逻辑的场景)

禁用内置hover功能,通过事件绑定实现自定义切换:

from customtkinter import CTk, CTkButton

def inputscreen():
    pass

main = CTk()

start_button = CTkButton(
    main, 
    text="Start",
    command=inputscreen,
    corner_radius=50,
    height=50,
    width=70,
    fg_color="#FFFFFF",
    text_color="#00EC00",
    hover=False  # 禁用内置hover,避免冲突
)

def on_hover_enter(event):
    event.widget.configure(fg_color="#00EC00", text_color="white")

def on_hover_leave(event):
    event.widget.configure(fg_color="#FFFFFF", text_color="#00EC00")

start_button.bind("<Enter>", on_hover_enter)
start_button.bind("<Leave>", on_hover_leave)

start_button.pack()

main.mainloop()

关键修复点

  1. 修正lambda表达式的语法错误,将所有配置项放在configure()方法内部。
  2. 内置hover方式中,使用text_color_hover直接设置悬停文字颜色,无需手动绑定事件。
  3. 手动绑定方式中,禁用内置hover并使用独立的事件处理函数,通过event.widget动态获取按钮实例,避免硬编码。
  4. 添加pack()方法将按钮渲染到窗口,原代码缺失此步骤会导致按钮无法显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:28:13