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

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

关键修改说明

  1. 窗口隐藏与延迟显示:创建win2后用withdraw()隐藏,组件全部创建完成后用deiconify()显示,避免中间渲染过程暴露。
  2. Frame背景色统一:给frame_schermo添加bg=bg属性,使其背景与主窗口一致,消除白色过渡帧。
  3. 移除重复事件循环:Toplevel窗口不需要单独调用mainloop(),主窗口的事件循环已能处理所有交互,重复调用会导致窗口阻塞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:55:25