【问题标题】:Read parameters like eta from youtube-dl从 youtube-dl 读取 eta 等参数
【发布时间】:2016-11-14 19:52:56
【问题描述】:

您好,我想在 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、大小、速度等

【问题讨论】:

标签: python wxpython youtube-dl


【解决方案1】:

只要你在这个函数中被阻塞并且没有让控制返回到事件循环,那么就不会有事件被分派给处理程序。没有事件被发送和处理,小部件的内容就不能重绘,不能与鼠标和键盘交互,什么都没有。基本上,应用程序被冻结了,因为您的执行功能没有让其心跳,并且大脑与身体的其他部分被切断。

在对 GUI 或事件驱动编程的其他实现进行编程时,关键是永远不要在事件处理程序或回调中执行任何在返回事件循环之前需要花费超过(人类)明显时间量的事情。如果你有一些需要比那个时间更长的东西,那么你需要重新设计它,以便以不同的方式管理长期运行的任务。

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

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

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

【讨论】:

  • 好的,谢谢。我会试试的,也谢谢你的链接
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 2014-07-06
  • 2018-04-11
  • 2020-06-03
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多