PySimpleGUI - window 更改时不显示背景

PySimpleGUI - not show background when window change

在我的应用程序中,我有多个 windows 根据事件(一个关闭另一个打开)而变化,并且一次只显示一个 window。在一个 window 关闭和另一个打开期间,从数据库获取数据并准备 window 需要一些时间。

这里的问题是,在一个window关闭和另一个打开的过程中,用户可以通过查看背景看到并感觉到一个正在打开另一个正在关闭。

我想要的,直到第二个屏幕未完全加载,第一个window在屏幕上可见。

我当前的代码是这样的,

import PySimpleGUI as sg

layout = [[sg.Button('Users', key='show_user_list')]]
window = sg.Window('users').Layout(layout)
while True:
    event, values = window.Read()
    if event == 'show_user_list':
        window.Close()  
        # code ommited here for simplicity
        # do mysql stuff to fetch data
        # layout2 = ...
        # window2 = sg.Window('user listing').Layout(layout2)
        # while True:
        #   event, values = window2.Read()
        #   ...
        # like that I have multiple windows
    else:
        pass

我如何才能让用户感觉 window 内容正在改变,而不是一个 window 关闭而另一个打开?

当然,您可以先打开您的 Window 2,确保看不到背景,它将在 Window 1 之上创建,然后关闭您的 Window 1 .

为此,将 .Finalize() 添加到 Window 2 创建。这将导致 window 立即出现。然后在下一行,关闭 Window 1.

import PySimpleGUI as sg

layout = [[sg.Button('Users', key='show_user_list')]]
window = sg.Window('users').Layout(layout)
while True:
    event, values = window.Read()
    if event == 'show_user_list':

        # code ommited here for simplicity
        # do mysql stuff to fetch data
        # layout2 = ...
        # window2 = sg.Window('user listing').Layout(layout2).Finalize()
        # window.Close() 
        # while True:
        #   event, values = window2.Read()
        #   ...
        # like that I have multiple windows
    else:
        pass

进行这种 window 更新的关键是在同一位置创建 windows。默认设置 windows 位于屏幕中央。这意味着,如果您的 windows 大小不同,那么当您从一个更改为另一个时,您可能会注意到一个小的 "blip"。但它看起来应该不错,因为它会发生得如此之快。

如果你真的想要花哨的,你可以添加另一个步骤,这将使 windows 之间的切换更加顺畅。这个新步骤涉及创建 window 2,Alpha=0,这意味着它是不可见的,然后在它完全形成后(使用 Finalize())将 Alpha 更改为 1,这将使 window 出现.

import PySimpleGUI as sg

layout = [[sg.Text('Example of window-replacement')],
          [sg.Combo(['abdeffg', 'rrrfwwew'], size=(10, 4))],
          [sg.B('Enable Filter'), sg.B('Warning'), sg.B('Reopen')],]

window = sg.Window('My Text Editor', layout)

while True:             # Event Loop
    event, values = window.Read()
    if event is None:
        break
    print(event, values)
    if event == 'Reopen':
        layout2 = [[sg.Text('This is a completely different window')],
                   [sg.Combo(['abdeffg', 'rrrfwwew'], size=(10, 4))],
                   [sg.B('Enable Filter'), sg.B('Warning'), sg.B('Reopen')], ]
        window2 = sg.Window('My Text Editor', layout2, alpha_channel=0).Finalize()
        window2.SetAlpha(1)
        window.Close()
        window = window2

window.Close()

这删除了我看到的 window 中的一些 "painting"。这不应该发生,因为我在开始创建 window 时使用了同样的技巧。 Alpha 用于在创建时隐藏 window。