Skip to main content
 首页 » 编程设计

python之子进程 Popen 阻塞 PyQt GUI

2025年05月04日27Free-Thinker

我正在尝试使用 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