《在Python實現print標准輸出sys.stdout、stderr重定向及捕獲的簡單辦法》介紹了Python實現重定向的方法,在PyQt程序中,可以在上文的基礎上,將標准輸出信息輸出重定向到類似QTextBrowser、QLineEdit、QLabel等圖形界面對象上。
實現步驟如下:
- 備份標准輸出sys.stdout、stderr對象,以便恢復或做其他處理;
- 在主界面派生類或其他圖像界面派生類中定義write方法
Python判斷對象是否支持文件IO,是個典型的鴨子類型處理方式,就是看對象是否實現了讀寫方法,由於標准輸出無需讀只需寫,因此只要在圖形界面派生類實現了write方法后即可使用該圖形界面類的實例替代標准輸出即可 - 在圖形界面派生類write方法中將要輸出信息輸出到圖形界面類子對象中
在此需要注意,輸出到圖形對象的信息在程序輸出過程中可能不會即時顯示,導致給人的感覺是沒有輸出一樣,為了確保輸出信息即時顯示需要在write方法中主動調用應用的processEvents方法。
示例代碼:
class mainWin(QtWidgets.QWidget,ui_mainWin.Ui_mainWin):
def __init__(self):
super().__init__()
self.setupUi(self)
self.stdoutbak = sys.stdout
self.stderrbak = sys.stderr
sys.stdout = self
def write(self,info):
self.proccessInf.insertPlainText(info)
if len(str):self.currentInf.setText(str)
QtWidgets.qApp.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents|QtCore.QEventLoop.ExcludeSocketNotifiers)
self.stdoutbak.write(info)
def restoreStd(self):
print("准備恢復標准輸出")
sys.stdout = self.stdoutbak
sys.stderr = self.stderrbak
print("恢復標准輸出完成")
def __del__(self):
self.restoreStd()
以上方法不但能捕獲自己實現代碼的輸出到圖形界面中,還能將第三方模塊輸出信息也捕獲到圖形界面中。具體可以參考《第15.40節、PyQt(Python+Qt)實戰:moviepy實現MP4視頻轉gif動圖的工具》