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

Windows下CustomTkinter销毁Entry组件后异常矩形的修复方法

问题:销毁Canvas嵌入的CTkEntry后残留奇怪矩形(Windows系统)

这个问题并非你独有,在Windows系统下使用CustomTkinter的CTkCanvas嵌入组件并销毁时,确实可能出现这类残留渲染问题,属于组件与Canvas交互时的底层渲染bug。

问题原因

当你通过canvas.create_window()将CTkEntry嵌入Canvas后,组件的渲染由CustomTkinter和Tkinter底层共同处理。直接销毁Entry时,Canvas可能无法及时正确重绘对应区域,导致原组件的边界或背景矩形残留。

解决方案(保留canvas.create_window()的前提下)

你需要先删除Canvas上绑定该Entry的window条目,再销毁组件,最后强制Canvas重绘对应区域。修改后的代码如下:

from customtkinter import *

set_appearance_mode('System')
set_default_color_theme('dark-blue')

window = CTk()  # Window
window.geometry("800x520")

def destroy(event):
    # 获取Entry对应的Canvas窗口项ID
    item_id = canvas.find_withtag(event.widget)[0]
    # 先移除Canvas上的绑定条目
    canvas.delete(item_id)
    # 销毁Entry组件
    event.widget.destroy()
    # 强制Canvas重绘,消除残留
    canvas.update_idletasks()

def text(event):
    entry = CTkEntry(window, width=100, font=('Arial', 24), text_color='black')
    entry.bind("<Button-3>", destroy)
    canvas.create_window(event.x, event.y, window=entry)

canvas = CTkCanvas(window, bg='white', bd=2, relief=SUNKEN, height=430, width=700)
canvas.place(x=60, y=50)
canvas.bind("<Button-1>", text)

window.mainloop()  # Loop

说明

  • canvas.find_withtag(event.widget)可以找到绑定该Entry的Canvas窗口项ID,确保我们删除的是正确的Canvas元素
  • 先删除Canvas条目再销毁组件,避免Canvas保留无效的渲染标记
  • canvas.update_idletasks()强制Canvas立即处理所有待完成的重绘任务,彻底清除残留矩形

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:03:14