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

CTkButton鼠标悬停切换图片时出现闪烁问题求助

问题原因分析

当鼠标进入按钮触发<Enter>事件显示图标后,图标作为按钮的子元素会覆盖按钮的部分交互区域。此时鼠标悬停在图标上时,会被系统判定为离开按钮的主交互区域,进而触发<Leave>事件;<Leave>事件触发后隐藏图标,图标消失后鼠标又回到按钮的主交互区域,再次触发<Enter>事件,如此循环往复就造成了图标持续闪烁的现象。

另外你代码中调用了私有方法button._draw(),虽然这不是核心原因,但手动触发重绘可能会加重闪烁问题——configure()方法本身就会自动触发组件重绘,无需手动调用。

解决方案

可以通过判断鼠标离开的目标是否为按钮的子组件,避免图标区域触发不必要的<Leave>事件,修改后的代码如下:

import customtkinter as ctk
from PIL import Image

window = ctk.CTk()
window.geometry("200x200")

icon = ctk.CTkImage(
    light_image=Image.open("trash.png"),
    dark_image=Image.open("trash.png")
)

def show_icon(event):
    button.configure(image=icon)

def hide_icon(event):
    # 仅当鼠标真的离开按钮组件(而非子元素)时,才隐藏图标
    if event.widget not in button.winfo_children():
        button.configure(image=None)

button = ctk.CTkButton(
    window,
    text="",
    image=None,
    fg_color="white",
    hover_color="white",
    width=36,
)

button.pack()

button.bind("<Enter>", show_icon)
button.bind("<Leave>", hide_icon)

window.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:40:19