PySimpleGUI: Как window.read() связан с обновлением окна или элемента?

#pysimplegui

Вопрос:

У меня есть окно Graph , которое в основном показывает изображение камеры с некоторым наложением.

При попытке очистить код в стиле ООП я столкнулся с проблемой, что некоторые элементы больше не отображаются или не обновляются. Я знаю, что это вызвано тем, как обновление расположено относительно window.read() , но я не мог понять, как правильно заставить его работать.

До сих пор код выглядит так

 import PySimpleGUI as sg

while True:

    gui.window['-MAIN-'].draw_text('some_text', (80, 15), color='black')

    event, values = gui.update()

    if event == 'Exit' or event == sg.WIN_CLOSED:
        break

    gui.window['-PAUSE-'].update(f'Paused')

    gui.window['-MAIN-'].erase()

    gui.window['-MAIN-'].draw_image(data=some_bytes)
 

Вещи, которые я использую, это

  • удаление основного компонента Graph.erase()
  • изменение этикеток с помощью element.update()
  • рисование на графике element.draw_image()

Из того, что я прочитал в документации, я предполагаю, что обновления элементов ti, которые сделаны с использованием element.update() , применяются один раз window.read() , вызывается. Это правильно?

И это то же самое для element.draw_image() и Graph.erase() ?

Поскольку я не уверен, как именно это работает, я не знаю, какой был бы хороший способ упорядочить вещи в основном цикле.

Из примеров в кулинарной книге я увидел, что первое, что обычно помещается в виде события, — это призыв window.read() .

Но для чего было бы подходящее место Graph.erase() ? До или после window.read() ?

Ответ №1:

Во-первых, определите макет и ваше окно, графический интерфейс не будет создан, если окно еще не завершено с помощью вызываемой опции finalize=True или метода finalize .

После завершения работы с окном или графическим интерфейсом вы можете что-то сделать с окном или элементами, например, вызвать update элементы, нарисовать или стереть рисунки sg.Canvas , все эти действия просто обновляют окно или элементы, на самом деле не в графическом интерфейсе.

Два метода обновят графический интерфейс, sg.Window.read или sg.Window.refresh .

Позвоните refresh , если вы хотите немедленно обновить графический интерфейс, или позвоните read до того, как ваш графический интерфейс будет готов к реагированию на любые события с клавиатуры/мыши или иначе.

В большинстве случаев первое утверждение в вашем цикле событий-это event, values = window.read() «затем сделайте что-то, для чего произошло событие».