CustomTkinter组件创建初始为白色的问题及解决方案咨询
解决CustomTkinter窗口及组件初始白色闪烁问题
问题现象
创建新窗口时,窗口背景先显示白色,随后才切换为#1A1A1A;同时组件初始会呈现白色矩形框(如以下示意图):
- 窗口背景初始白色示意图:

- 组件初始白色矩形示意图:

解决方案
核心思路是替换原生Tkinter的Toplevel为CustomTkinter专属的CTkToplevel,并通过先隐藏窗口、完成所有组件创建后再显示的方式,彻底避免初始白色闪烁:
CTkToplevel本身适配CustomTkinter的主题系统,初始背景就会匹配深色主题,无需手动修改背景色- 先调用
withdraw()隐藏窗口,创建完所有组件后再用deiconify()显示,避免组件加载过程中的视觉闪烁
修改后的完整代码
from tkinter import * import customtkinter # 提前设置CustomTkinter的外观模式和颜色主题,统一风格 customtkinter.set_appearance_mode("dark") customtkinter.set_default_color_theme("dark-blue") def function(): # 替换原生Toplevel为CTkToplevel win_bollettini = customtkinter.CTkToplevel(win) win_bollettini.resizable(False,False) win_bollettini.title('Bollettini') # 先隐藏窗口,避免组件加载时的闪烁 win_bollettini.withdraw() # 创建所有组件 casella_matricola = customtkinter.CTkEntry(win_bollettini, corner_radius=8, width=150, placeholder_text='Matricola', border_color='#505050',border_width=3, fg_color='#282828', text_color='white',font=('Courier', 17)) casella_matricola.pack(padx=50,pady=(20,20)) casella_n_bollettini = customtkinter.CTkEntry(win_bollettini,corner_radius=8,width=50,placeholder_text='Num',border_color='#505050',border_width=3,fg_color='#282828',text_color='white',font=('Courier',17)) casella_n_bollettini.pack(pady=(0,17)) check_cambio_primario = customtkinter.CTkCheckBox(win_bollettini, text='Cambio primario', font=('Courier', 17), text_color='white',fg_color='green', hover_color='#289253') check_cambio_primario.pack(pady=(0,20)) check_to_normale = customtkinter.CTkCheckBox(win_bollettini, text='TO normale', font=('Courier', 17), text_color='white',fg_color='green', hover_color='#289253') check_to_normale.pack(pady=(0,20)) check_to_con_primario = customtkinter.CTkCheckBox(win_bollettini, text='TO con primario', font=('Courier', 17), text_color='white',fg_color='green', hover_color='#289253') check_to_con_primario.pack(pady=(0,20)) check_bltn_gia_fatti = customtkinter.CTkCheckBox(win_bollettini,text='Già iniziati',font=('Courier',17),text_color='white',fg_color='green',hover_color='#289253') check_bltn_gia_fatti.pack(pady=(0,20)) check_curve = customtkinter.CTkCheckBox(win_bollettini,text='Curve',font=('Courier',17),text_color='white',fg_color='green',hover_color='#289253') check_curve.pack(pady=(0,20)) selezione_n_secondari_curve = customtkinter.CTkComboBox(win_bollettini,values=['1','2','3','4','5'],width=53,corner_radius=7,fg_color='#1A1A1A',text_color='white',button_color='#3C3F41',border_color='#3C3F41',button_hover_color='#373737',dropdown_fg_color='#1A1A1A',dropdown_text_color='white',dropdown_hover_color='#2B2B2B') selezione_n_secondari_curve.set('1') selezione_n_secondari_curve.pack(pady=(0,40)) btn_ok = customtkinter.CTkButton(master=win_bollettini, text='Fatto', font=('Courier', 16, 'bold'), width=10, corner_radius=9,fg_color='#072D56',hover_color='#072851',border_color='black',border_width=2) btn_ok.pack(pady=(0,20)) # 窗口居中并显示 win.eval(f'tk::PlaceWindow {str(win_bollettini)} center') win_bollettini.deiconify() win = Tk() # 主窗口也设置对应背景色,保持风格统一 win.configure(bg='#1A1A1A') button = Button(win,text='Click me',font=('Ink free',20),command=function, bg='#1A1A1A', fg='white') button.pack(padx=30,pady=30) win.eval('tk::PlaceWindow . center') win.mainloop()
关键改动说明
- 使用
CTkToplevel替代原生Toplevel:CTkToplevel是CustomTkinter专为自身组件设计的顶层窗口,初始背景会自动匹配设置的深色主题,彻底消除窗口初始白色的问题 - 窗口先隐藏后显示:通过
withdraw()和deiconify()的组合,确保所有组件都创建完成后再展示窗口,避免组件加载过程中的白色矩形闪烁 - 统一全局主题设置:提前调用
set_appearance_mode和set_default_color_theme,让所有组件默认风格统一,减少手动设置的冗余
内容的提问来源于stack exchange,提问作者Stefan9669
相关产品推荐
相关产品推荐

