从 youtube-dl 读取 eta 等参数

Read parameters like eta from youtube-dl

您好,我想在 cmd 上读取 youtube dl 的输出并放入我的 wxpython 程序中。这是我使用的功能。

        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 程序开始更新 textctrl,然后卡住了。它没有更新 eta、大小、速度等

只要您在此函数中被阻塞并且不让控制权 return 进入事件循环,就不会有事件分派给处理程序。没有事件被发送和处理,就没有小部件内容的重绘,没有与鼠标和键盘的交互,什么都没有。基本上应用程序被冻结是因为你的执行功能没有让它的心跳并且大脑与 body.

的其余部分隔绝了

在对 GUIs 或事件驱动编程的其他实现进行编程时,关键是永远不要在事件处理程序或回调中执行任何需要花费超过(人类)注意到的时间的事情它 returns 到事件循环。如果您有一些事情需要比那个时间更长的时间,那么您需要重新设计它,以便以不同的方式管理漫长的 运行ning 任务。

一种方法是在事件处理程序中进行设置(例如启动进程),然后从事件处理程序中进行 return。该设置的一部分是启动一个计时器,该计时器会定期返回并检查是否有可用的输出。如果是,则读取它(不阻塞)并处理它,然后 return 再次进入事件循环。继续直到该过程完成,然后在处理完最后一块数据后停止计时器。

另一种方法是使用线程来运行 长运行ning 任务。这是一种常见的方法,但您需要注意不要从工作线程中操作任何 UI objects。因此,在您的示例中,您从流程中读取的文本需要发送回 GUI 线程,以便将其附加到文本控件。 wx.CallAfter 是一种简单的方法。

有关详细信息和一些示例,请参阅 https://wiki.wxpython.org/LongRunningTasks