2016-07-12 1 views
0

Привет Я хотел бы прочитать вывод youtube dl на cmd и поместить в мою программу wxpython. Это функция, которую я использовал.Чтение параметров, таких как eta from youtube-dl

 def execute(self,command,textctrl): 
       process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
       output = '' 

       # Poll process for new output until finished 
       for line in iter(process.stdout.readline, ""): 
        textctrl.AppendText(line) 
        output += line 


       process.wait() 
       exitCode = process.returncode 

       if (exitCode == 0): 
        return output 
       else: 
        raise Exception(command, exitCode, output) 

Программа wxpython начала обновление текста и затем замерзала. Он не обновлял eta, размер, скорость и т. Д.

+0

Почему вы не используете [youtube-dl API] (https://github.com/rg3/youtube-dl/blob/master/README.md#embedding-youtube-dl)? – phihag

ответ

0

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

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

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

Другим подходом является использование потока для выполнения долговременной задачи. Это общий подход, но вам нужно быть осторожным, чтобы не манипулировать никакими объектами пользовательского интерфейса из рабочего потока. Поэтому в вашем примере текст, который вы прочитали из процесса, нужно будет отправить обратно в поток GUI, чтобы добавить его в текстовый элемент управления. wx.CallAfter - простой способ сделать это.

См. https://wiki.wxpython.org/LongRunningTasks для получения более подробной информации и некоторых примеров.

+0

Хорошо спасибо. Я попробую это, а также спасибо за ссылки – Boikem

Смежные вопросы