Как я могу не допустить, чтобы мои окна, созданные с помощью pysimplegui, перестали отвечать на запросы?

#python #oop #pysimplegui

Вопрос:

У меня есть главное окно, расположение которого определяет функции его кнопок. Если нажать кнопку «Разбор», запускается поток, в котором выполняется моя функция разбора. Я пытаюсь использовать очередь для определения хода выполнения функций с помощью метода get для обновления переменной, которая будет использоваться для обновления индикатора выполнения.

Из-за того, что я использую цикл while, мои окна перестают отвечать на запросы.

Индикатор выполнения-это отдельное окно от основного, и у меня возникли проблемы с поиском способа заставить это работать. Большинство примеров потоковой передачи находятся в ООП, в которой я пока не очень силен.

 elif event == "Parse":

        if layout == 1:
            
            q = queue.Queue()
        
            layout = [[GUI.Text('Parsing...')],
                      [GUI.ProgressBar(1, orientation='h', size=(20, 20), key='progressbar', bar_color = ('navy','white'))]]
            window1 = GUI.Window('Progress', layout).Finalize()
            progress_bar = window1['progressbar']
            
            t1 = threading.Thread(target=ParseTSLogs, daemon=True, args = (q,))
            t1.start()

            temp = 0
            print(temp)
            while temp != 3:
                temp = q.get()
                progress_bar.UpdateBar(temp,3)

            window1.close()
 

Как я могу не допустить, чтобы мои окна перестали отвечать на запросы, если я не могу поместить код окна выполнения в очередь? Как я уже сказал, я не до конца понимаю многие примеры потоков/очередей, поскольку они написаны в ООП.

Комментарии:

1. Что это такое q и что это такое ParseTSLogs ?

2. Оконные приложения нуждаются в запущенном цикле событий. Если вы находитесь в замкнутом цикле, ожидая, пока температура будет установлена на 3, вы не обрабатываете события. Вместо этого, когда все, что q.get() происходит, становится 3 в рабочем потоке, используйте event_generate для публикации события в потоке пользовательского интерфейса и привязки обработчика к этому виртуальному событию. Вы должны разрешить mainloop обрабатывать события в любое время.

3. В PySimpleGUI есть ряд новых API, которые помогают при «длительных операциях» и множестве демонстрационных программ. Если вы не читали документы о них и не просматривали звонки, я уверен, что это поможет их прочитать.

4. Если я правильно это понимаю… Я считаю, что у меня есть запущенный цикл событий (хотя это правда). Это заявление элифа является одним из событий. добавили q. ParseTSLogs-это функция, которая используется для анализа журналов. Я понимаю, почему это не сработает. Мне трудно найти решение для этого…