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

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()

关键改动说明

  1. 使用CTkToplevel替代原生Toplevel:CTkToplevel是CustomTkinter专为自身组件设计的顶层窗口,初始背景会自动匹配设置的深色主题,彻底消除窗口初始白色的问题
  2. 窗口先隐藏后显示:通过withdraw()和deiconify()的组合,确保所有组件都创建完成后再展示窗口,避免组件加载过程中的白色矩形闪烁
  3. 统一全局主题设置:提前调用set_appearance_mode和set_default_color_theme,让所有组件默认风格统一,减少手动设置的冗余

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:05:07