Tkinter创建Toplevel窗口时出现白色闪烁问题求助
解决Tkinter Toplevel窗口创建时的白色闪烁问题
问题分析
窗口左侧的白色闪烁是因为Tkinter创建窗口时会先渲染默认白色背景,再加载自定义深色背景和组件。尤其是左侧的frame_schermo初始未设置背景色,在黑色Label加载完成前,Frame会显示默认白色,导致瞬间闪烁。
解决方案
通过以下步骤解决:
- 给所有容器Frame提前设置匹配的背景色,避免默认白色暴露
- 先隐藏窗口,待所有组件创建完成后再显示
- 移除多余的
mainloop()调用,避免事件循环冲突
修改后的代码
from tkinter import * import customtkinter from ctypes import windll windll.shcore.SetProcessDpiAwareness(1) def click_selettore(event): bg = "#414141" win.attributes('-topmost', 0) # 创建窗口后立即隐藏,避免中间渲染闪烁 win2 = Toplevel(win) win2.withdraw() win2.focus() win2.resizable(False,False) win2.grab_set() win2.configure(bg=bg) win2.title("Selettore colori") # 给frame_schermo设置匹配背景色,避免加载Label前显示白色 frame_schermo = Frame(win2, bg=bg) frame_schermo.grid(row=0,column=0,padx=(20,0),pady=(20,0)) schermo = Label(frame_schermo, bg="#000000", width=45, height=9, relief="solid", borderwidth=3) schermo.grid(row=0,column=0) frame_slider = Frame(win2,bg=bg) frame_slider.grid(row=0,column=1,sticky=N,pady=(20,0),padx=(50,0)) etc_rosso = Label(frame_slider, text="Rosso", bg=bg, fg="#C70000", font=("Ink Free", 20, "bold")) etc_rosso.grid(row=0,column=0,pady=(11,0)) slider_rosso = customtkinter.CTkSlider(frame_slider, from_=0, to=255,width=230,progress_color='#C70000',fg_color='#a34949',button_hover_color='#3f9feb',button_color='#1f82d1') slider_rosso.grid(row=0,column=1,sticky=N,padx=(10,0),pady=(23,0)) slider_rosso.set(0) casella_rosso = customtkinter.CTkEntry(master=frame_slider,text_font=('Courier',15,'bold'),width=55) casella_rosso.grid(row=0,column=2,pady=(11,0),padx=(7,20)) casella_rosso.insert(0,0) etc_verde = Label(frame_slider, text="Verde", bg=bg, fg="#3fc441", font=("Ink Free", 20, "bold")) etc_verde.grid(row=1,column=0,pady=(11,0)) slider_verde = customtkinter.CTkSlider(frame_slider, from_=0, to=255, width=230, progress_color='#3fc441', fg_color='#3d803e', button_hover_color='#3f9feb', button_color='#1f82d1') slider_verde.grid(row=1, column=1, sticky=N,padx=(10,0),pady=(23,0)) slider_verde.set(0) casella_verde = customtkinter.CTkEntry(master=frame_slider, text_font=('Courier', 15, 'bold'), width=55) casella_verde.grid(row=1, column=2,pady=(11,0),padx=(7,20)) casella_verde.insert(0, 0) etc_blu = Label(frame_slider, text="Blu", bg=bg, fg="#010178", font=("Ink Free", 20, "bold")) etc_blu.grid(row=2,column=0,pady=(11,0)) slider_blu = customtkinter.CTkSlider(frame_slider, from_=0, to=255, width=230, progress_color='#010178',fg_color='#222275', button_hover_color='#3f9feb', button_color='#1f82d1') slider_blu.grid(row=2, column=1, sticky=N,padx=(10,0),pady=(23,0)) slider_blu.set(0) casella_blu = customtkinter.CTkEntry(master=frame_slider, text_font=('Courier', 15, 'bold'), width=55) casella_blu.grid(row=2, column=2,pady=(11,0),padx=(7,20)) casella_blu.insert(0, 0) frame_sotto_slider = Frame(win2,bg=bg) frame_sotto_slider.grid(row=1,column=0,pady=(45,0),padx=(35,0)) etc_esadecimale_titolo= Label(frame_sotto_slider,text='Esadecimale -> ',font=('Courier',16),fg='white',bg=bg) etc_esadecimale_titolo.grid(row=0,column=0) campo_esadecimale = customtkinter.CTkEntry(master=frame_sotto_slider,text_font=('Courier',16),width=105) campo_esadecimale.grid(row=0,column=1,padx=(6,0)) btn_ok = customtkinter.CTkButton(win2,text='Ok',text_font=('Courier',16),width=50,corner_radius=10,hover_color='#3a76a6') btn_ok.grid(row=3,column=1,sticky=E,pady=(50,10),padx=(0,10)) win.eval(f'tk::PlaceWindow {str(win2)} center') # 所有组件创建完成后再显示窗口 win2.deiconify() win = Tk() win.configure(bg="#2b2b2b") etichetta_selettore_colori = Label(win,text='OPEN',relief="solid",borderwidth=4,font=('Helvetica',17)) etichetta_selettore_colori.grid(row=0,column=0,padx=(20,0),pady=20) etichetta_selettore_colori.bind("<Button-1>",click_selettore) win.eval('tk::PlaceWindow . center') win.mainloop()
关键修改说明
- 窗口隐藏与延迟显示:创建
win2后用withdraw()隐藏,组件全部创建完成后用deiconify()显示,避免中间渲染过程暴露。 - Frame背景色统一:给
frame_schermo添加bg=bg属性,使其背景与主窗口一致,消除白色过渡帧。 - 移除重复事件循环:Toplevel窗口不需要单独调用
mainloop(),主窗口的事件循环已能处理所有交互,重复调用会导致窗口阻塞。
内容的提问来源于stack exchange,提问作者Forty966996
相关产品推荐
相关产品推荐

