亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何捕獲Python解釋器的輸出并在Text小部件中顯示?

如何捕獲Python解釋器的輸出并在Text小部件中顯示?

HUWWW 2019-11-29 15:38:30
我有一個使用PyQt的Python程序,旨在在Windows上運行。該程序進行了大量操作,并打印了大量信息。但是,由于我想凍結它,并且不希望出現提示屏幕,所以我希望所有這些信息都出現在主應用程序中,例如QTextEdit中。我如何使程序正常工作,以便它從解釋器獲取輸出,并同時在textEdit上顯示它,就像在真正的解釋器上一樣?
查看完整描述

3 回答

?
慕森王

TA貢獻1777條經驗 獲得超3個贊

我假設“來自解釋器的輸出”是指寫入控制臺或終端窗口的輸出,例如使用產生的輸出print()。


Python產生的所有控制臺輸出都被寫入程序的輸出流sys.stdout(正常輸出)和sys.stderr(錯誤輸出,例如異?;厮荩_@些是類似文件的對象。


您可以將這些流替換為您自己的類似文件的對象。您的所有自定義實現都必須提供一個write(text)函數。通過提供自己的實現,您可以將所有輸出轉發到您的小部件:


class MyStream(object):

    def write(self, text):

        # Add text to a QTextEdit...


sys.stdout = MyStream()

sys.stderr = MyStream()

如果您需要重置這些流,它們仍然可以通過sys.__stdout__和使用sys.__stderr__:


sys.stdout = sys.__stdout__

sys.stderr = sys.__stderr__

更新資料


這是PyQt4的一些工作代碼。首先定義一個流,該流報告使用Qt信號寫入其中的數據:


from PyQt4 import QtCore


class EmittingStream(QtCore.QObject):


    textWritten = QtCore.pyqtSignal(str)


    def write(self, text):

        self.textWritten.emit(str(text))

現在,在您的GUI中,將此流的一個實例安裝到sys.stdout并將textWritten信號連接到將文本寫入到的插槽中QTextEdit:


# Within your main window class...


def __init__(self, parent=None, **kwargs):

    # ...


    # Install the custom output stream

    sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)


def __del__(self):

    # Restore sys.stdout

    sys.stdout = sys.__stdout__


def normalOutputWritten(self, text):

    """Append text to the QTextEdit."""

    # Maybe QTextEdit.append() works as well, but this is how I do it:

    cursor = self.textEdit.textCursor()

    cursor.movePosition(QtGui.QTextCursor.End)

    cursor.insertText(text)

    self.textEdit.setTextCursor(cursor)

    self.textEdit.ensureCursorVisible()


查看完整回答
反對 回復 2019-11-29
  • 3 回答
  • 0 關注
  • 946 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號