在我的应用程序中,我有多个基于事件(一个关闭另一个打开)更改的窗口,并且一次仅显示一个窗口。在一个窗口关闭而另一个窗口打开期间,从数据库中获取数据并准备窗口需要花费一些时间。
这里的问题是,在一个窗口关闭时,另一位打开的用户通过查看背景可以看到并感觉一个正在打开,而另一个正在关闭。
我想要的是,直到第二个屏幕未完全加载,屏幕上才能看到第一个窗口。
我当前的代码是类似的
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
如何让用户感觉窗口内容正在变化,而不是一个窗口关闭而另一个窗口打开?
答案 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用于在创建窗口时隐藏它。