python - 子进程 Popen 阻塞 PyQt GUI

标签 python user-interface pyqt subprocess popen

我正在尝试使用 PyQt 为名为“HandBrake”的视频转换器应用程序构建一个简单的图形用户界面。

我的问题是,当我选择要转换的视频文件时,子进程 Popen 使用必要的参数启动 handbrake 应用程序,但在等待 handbrake 完成时,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

关于python - 子进程 Popen 阻塞 PyQt GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5613922/

相关文章:

python - 哪里有关于使用 python 包的很好的讨论?

c++ - 移植到 MSVS2010 C++ GUI 的 MSVS2010 C++ 控制台代码失败。为什么?

python - 使用 Bx 和 By 在 python 中剪切图像以进行前向和后向映射

python - 在 Python 中为 Django Choice 字段创建智能循环列表

java - 随机像素的图像

python - 如何知道QTableWidget的单元格是否正在被编辑?

python - EventFilter 中的问题,使用 QLineEdit 中的 Alt/Shift 修饰符

qt - 在 PyQT 中将 2D 屏幕坐标转换为 3D 坐标

python - 从数据框列中提取异常

java - SWT 复合和组