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
相关产品推荐
相关产品推荐

