PySimpleGUI-窗口更改时不显示背景

时间:2019-07-01 03:40:02

标签: python-3.x pysimplegui

在我的应用程序中,我有多个基于事件(一个关闭另一个打开)更改的窗口,并且一次仅显示一个窗口。在一个窗口关闭而另一个窗口打开期间,从数据库中获取数据并准备窗口需要花费一些时间。

这里的问题是,在一个窗口关闭时,另一位打开的用户通过查看背景可以看到并感觉一个正在打开,而另一个正在关闭。

我想要的是,直到第二个屏幕未完全加载,屏幕上才能看到第一个窗口。

我当前的代码是类似的

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

如何让用户感觉窗口内容正在变化,而不是一个窗口关闭而另一个窗口打开?

1 个答案:

答案 0 :(得分:1)

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

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