您好我想在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,大小,速度等
答案 0 :(得分:0)
只要您在此函数中被阻止并且不让控件返回到事件循环,就不会有任何事件被分派给处理程序。在没有发送和处理事件的情况下,不能重新绘制小部件的内容,不与鼠标和键盘交互,什么也不做。基本上应用程序被冻结,因为你的执行功能不会让它心脏跳动,大脑被切断身体的其他部分。
当编程GUI或事件驱动编程的其他实现时,关键是永远不要在事件处理程序或回调中做任何事情,它在返回事件循环之前需要的时间超过一个明显的(人为的)时间。如果您的某些内容需要的时间超过该时间,那么您需要重新设计它,以便以不同的方式管理长时间运行的任务。
一种方法是在事件处理程序中设置(例如启动进程),然后从事件处理程序返回。部分设置是启动定期返回的计时器并检查是否有可用输出。如果是,则读取它(不阻塞)并处理它,然后再次返回事件循环。继续,直到完成该过程,然后在处理完最后一块数据后停止计时器。
另一种方法是使用线程来运行长时间运行的任务。这是一种常见的方法,但您需要小心不要操作工作线程中的任何UI对象。因此,在您的示例中,您需要将从流程中读取的文本发送回GUI线程,以便将其附加到文本控件中。 wx.CallAfter
是一种简单的方法。
有关详细信息和一些示例,请参阅https://wiki.wxpython.org/LongRunningTasks。