PySimpleGUI - не показывать фон при изменении окна - PullRequest
1 голос
/ 01 июля 2019

В моем приложении у меня есть несколько окон, которые меняются в зависимости от событий (одно закрытие и другое открытие) и отображают только одно окно за раз. При закрытии одного окна и открытии другого требуется некоторое время с момента извлечения данных из базы данных и подготовки к окну.

Здесь проблема в том, что во время закрытия одного окна и открытия другого пользователя пользователь может видеть и чувствовать, что одно открывается, а другое закрывается, видя фон.

Что я хочу, пока второй экран не будет загружен полностью, первое окно будет видно на экране.

Мой текущий код похож на

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 Ответ

1 голос
/ 01 июля 2019

Конечно, вы можете убедиться, что фон не виден, сначала открыв окно 2, которое будет создано поверх окна 1, затем закрыв окно 1.

Для этого добавьте .Finalize() на создание окна 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

Ключом к выполнению такого обновления окна является создание окон в том же месте.По умолчанию окна создаются по центру экрана.Это означает, что если ваши окна не одинакового размера, вы, вероятно, заметите небольшой «всплеск» при переходе от одного к другому.Но это не должно выглядеть плохо, потому что это произойдет так быстро.

Если вы действительно хотите стать модным, вы можете добавить еще один шаг, который сделает переключение между окнами еще более плавным.Этот новый шаг включает в себя создание окна 2 с Alpha = 0, что означает, что оно невидимо, затем после того, как оно полностью сформировано (с помощью 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()

Это убрало некоторую «окраску» окна, которое я видел.Этого не должно быть, потому что я использую этот же трюк при создании окна для начала.Альфа используется, чтобы скрыть окно во время его создания.

...