2011-04-10 54 views
1

我正在嘗試使用PyQt爲名爲「HandBrake」的視頻轉換器應用程序構建一個簡單的GUI。子進程Popen阻止PyQt圖形用戶界面

我的問題是,當我選擇一個視頻文件進行轉換時,子進程Popen用必要的參數啓動手剎應用程序,但在等待手剎結束時,gui被阻止,因此我無法做任何更改。 (例如:我不能禁用pushButton,也不能更改它的文本)

我不是在尋找更復雜的解決方案,例如進度條等,但我只想簡單地禁用按鈕並在等待時更改其文本爲程序完成轉換。

我該怎麼用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 
+1

使用一個單獨的線程或使用'multiprocessing'。 – 2011-04-10 18:50:00

回答

10

既然你在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

1

如果你不關心輸出無論如何,你可以使用p.wait()等待subproc完成,但你仍然需要控制返回到QT主循環,所以你需要以某種方式插入線程。最簡單的解決方案將是這樣的:

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

有這許多未解決的問題。例如,是否允許從多個線程調用GUI操作?怎麼樣超時?但它應該足以讓你指向正確的方向。

+0

謝謝你的回答,但我想我忘記提及,我可以重新啓用按鈕後,但我不能禁用它在開始,雖然我打電話「self.pushButton.setEnabled(0)」功能在popen之前。 – eymen 2011-04-10 19:11:05