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':
        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

我怎样才能让用户感觉窗口内容正在改变,而不是一个窗口关闭而另一个窗口打开?

4

1 回答 1

2

当然,您可以通过首先打开窗口 2 来确保看不到背景,该窗口将在窗口 1 的顶部创建,然后关闭窗口 1。

为此,.Finalize()在 Window 2 创建中添加一个。这将导致窗口立即显示。然后在下一行,关闭 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

使这种窗口更新工作的关键是在同一位置创建窗口。默认设置是使窗口居中在屏幕上。这意味着如果您的窗口大小不同,那么当您从一个窗口更改为另一个窗口时,您可能会注意到一个小的“光点”。但它不应该看起来很糟糕,因为它会发生得如此之快。

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

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

这删除了我看到的窗口的一些“绘画”。这不应该发生,因为我在创建窗口时使用了同样的技巧。Alpha 用于在创建窗口时隐藏窗口。

于 2019-07-01T14:31:22.233 回答