子进程Popen阻塞PyQt GUI



我正在尝试使用PyQt为一个名为"HandBrake"的视频转换器应用程序构建一个简单的gui。

我的问题是,当我选择一个视频文件转换,子进程Popen启动手刹应用程序与必要的参数,但在等待手刹完成gui被阻塞,所以我不能做任何更改。(例如:我不能禁用按钮,也不能改变它的文本)

我不是在寻找一个更复杂的解决方案,如进度条等,但我想简单地禁用按钮,并改变其文本,同时等待程序完成转换。

我怎么能用python做这样的事情&pyqt吗?

def videoProcess():
    self.pushButton.setEnabled(0)
    self.pushButton.setText("Please Wait")
    command = "handbrake.exe -i somefile.wmv -o somefile.mp4"
    p = subprocess.Popen(str(command), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while 1:
        line = p.stdout.readline()
        if not line:
            self.pushButton.setEnabled(1)
            break

既然你已经在Qt领域了,你可以这样做:

from PyQt4.QtCore import QProcess
class YourClass(QObject):
    [...]
    def videoProcess(self):
        self.pushButton.setEnabled(0)
        self.pushButton.setText("Please Wait")
        command = "handbrake.exe"
        args =  ["-i", "somefile.wmv", "-o", "somefile.mp4"]
        process = QProcess(self)
        process.finished.connect(self.onFinished)
        process.startDetached(command, args)
    def onFinished(self, exitCode, exitStatus):
        self.pushButton.setEnabled(True)
    [...]
http://doc.qt.io/qt-5/qprocess.html

如果你不管怎样都不关心输出,你可以使用p.wait()来等待子进程完成,但是你仍然需要将控制返回给QT主循环,所以你需要以某种方式插入一个线程。最简单的解决方案是:

import threading
def reenable():
    p.wait()
    self.pushButton.setEnabled(1)
t = threading.Thread(reenable)
t.run()

有许多未解决的问题。例如,是否允许从多个线程调用GUI操作?暂停一下怎么样?但它应该足以为你指明正确的方向。

相关内容

  • 没有找到相关文章

最新更新