Пока вы заблокированы в этой функции и не позволяете управлению возвращаться к циклу событий, события, отправленные обработчикам, не могут быть отправлены. Поскольку никакие события не отправляются и обрабатываются, не может быть перекраски содержимого виджетов, без взаимодействия с мышью и клавиатурой, ничего. В основном приложение заморожено, потому что ваша функция выполнения не позволяет бить сердце, а мозг отключается от остальной части тела.
При программировании GUI или других реализаций программирования, управляемых событиями, ключ никогда не должен делать ничего в обработчике событий или обратном вызове, которые потребовали бы более чем заметного (человеческим) количества времени до того, как он вернется в цикл событий. Если у вас есть что-то, что займет больше времени, то вам нужно переконфигурировать его, чтобы управляемая работа выполнялась по-другому.
Одним из способов было бы установить вещи в обработчике событий (например, запустить процесс), а затем вернуться из обработчика события. Частью этой настройки было бы запустить таймер, который периодически возвращается и проверяет, доступен ли выход. Если это так, прочитайте его (без блокировки) и обработайте его, а затем снова вернитесь в цикл событий. Продолжайте, пока процесс не будет завершен, а затем остановите таймер после обработки последнего фрагмента данных.
Другим подходом является использование потока для выполнения долговременной задачи. Это общий подход, но вам нужно быть осторожным, чтобы не манипулировать никакими объектами пользовательского интерфейса из рабочего потока. Поэтому в вашем примере текст, который вы прочитали из процесса, нужно будет отправить обратно в поток GUI, чтобы добавить его в текстовый элемент управления. wx.CallAfter
- простой способ сделать это.
См. https://wiki.wxpython.org/LongRunningTasks для получения более подробной информации и некоторых примеров.
Почему вы не используете [youtube-dl API] (https://github.com/rg3/youtube-dl/blob/master/README.md#embedding-youtube-dl)? – phihag