簡體   English   中英

如何使用 Python 將控制台 output 定向到 pyqt5 plainTextEdit 小部件?

[英]How do I direct console output to a pyqt5 plainTextEdit widget with Python?

我正在嘗試在 PyQt5 的 QplainTextEdit 小部件中顯示 python 腳本的控制台 output。

我收到此錯誤:

TypeError:調用元類基礎時出錯元類沖突:派生 class 的元類必須是其所有基礎元類的(非嚴格)子類

我已經在 pyqt GUI 文件中定義了我的對象,並且我相信我擁有所有的導入。

更新

我已經修改了這個問題的代碼:

from PyQt5.QtCore import QRectF, Qt
from PyQt5.QtWidgets import QFileDialog, QPlainTextEdit
from PyQt5 import QtCore, QtGui, QtWidgets
from PIL import Image, ImageQt, ImageEnhance
# from PyQt5.QtGui import Qt
from pyqtgraph.examples.text import text

from covid19gui_V3 import Ui_MainWindow
import os
import sys

input_img = Image.open("/home/ironmantis7x/Documents/Maverick_AI/Python/keras-covid-19/maverickAI30k.png")
text_edit = QPlainTextEdit()

class EmittingStream(QtCore.QObject):

    textWritten = QtCore.pyqtSignal(str)
    def write(self, text):
        self.textWritten.emit(str(text))

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    textWritten = QtCore.pyqtSignal(str)
    def __init__(self, parent=None, **kwargs):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.ShowIButton.clicked.connect(self.do_test)
        self.chooseStudy.clicked.connect(self.do_choosestudy)
        self.RunButton_3.clicked.connect(self.do_runstudy)
        self.scene = QtWidgets.QGraphicsScene(self)
        self.graphicsView.setScene(self.scene)
        w, h = input_img.size
        self.pixmap_item = self.scene.addPixmap(QtGui.QPixmap())
        # self.graphicsView.fitInView(QRectF(0, 0, w, h), Qt.KeepAspectRatio)
        self.graphicsView.update()
        self.plainTextEdit.update()
        self.level = 1
        self.enhancer = None
        self.timer = QtCore.QTimer(interval=500, timeout=self.on_timeout)
        sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)

    def write(self, text):
        self.textWritten.emit(str(text))

    @QtCore.pyqtSlot()
    def do_test(self):
        # input_img = Image.open("/home/ironmantis7x/Documents/Maverick_AI/Python/keras-covid-19/maverickAI30k.png")
        self.enhancer = ImageEnhance.Brightness(input_img)
        self.timer.start()
        self.ShowIButton.setDisabled(True)

    @QtCore.pyqtSlot()
    def on_timeout(self):
        if self.enhancer is not None:
            result_img = self.enhancer.enhance(self.level)
            qimage = ImageQt.ImageQt(result_img)
            self.pixmap_item.setPixmap(QtGui.QPixmap.fromImage(qimage))
        if self.level > 7:
            self.timer.stop()
            self.enhancer = None
            self.level = 0
            self.ShowIButton.setDisabled(False)
        self.level = 1
        self.ShowIButton.setDisabled(False)

    @QtCore.pyqtSlot()
    def do_choosestudy(self):
        dlg = QFileDialog()
        dlg.setFileMode(QFileDialog.AnyFile)
        if dlg.exec_():
            filenames = dlg.selectedFiles()
            f = open(filenames[0], 'r')

    @QtCore.pyqtSlot()
    def do_runstudy(self):
        os.system("df -h")
        # filetext = open('screenout.txt').read()
        # filetext.close()
        # textViewValue = self.plainTextEdit.toPlainText()
        # QPlainTextEdit.appendPlainText(self, str(textViewValue))
        # sys.stdout = self(textWritten=self.textWritten)
        self.normalOutputWritten(text_edit)

    def __del__(self):
        # Restore sys.stdout
        sys.stdout = sys.__stdout__

    def normalOutputWritten(self, text_edit):
        #cursor = self.plainTextEdit.textCursor()
        #cursor.movePosition(QtGui.QTextCursor.End)
        #cursor.insertText(text_edit)
        self.plainTextEdit.appendPlainText(text_edit)
        #self.plainTextEdit.ensureCursorVisible()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

我怎樣才能使它正常工作?

更新 2

我確實對該主題進行了研究,這是我在發布問題之前用來嘗試解決問題的主要資源之一: 如何捕獲 Python 解釋器的 output 並在文本小部件中顯示?

更新 3

我在帖子中修改了我的代碼,以反映我用來幫助我解決問題的鏈接中的代碼建議。

我仍然無法讓它正確運行。 我現在收到此錯誤:

self.plainTextEdit.appendPlainText(text_edit) TypeError: appendPlainText(self, str): argument 1 has unexpected type 'QPlainTextEdit'

我有一個用戶界面 TableManagerWindow,我一直在 Qt 設計器中維護和開發它。 通過 pyuic 轉換為 *.py 文件后,我能夠實現您在上面提供的鏈接中提出的 Ferdinand Beyer 的建議。 將文本打印到終端的簡單按鈕,它確實通過 append() 附加到 QTextEdit 小部件。 由於某種原因,不確定這是否適合您,但我可以保證它也對我有用。 我不夠精明,無法了解導致您的問題的細微差別,但我想我會把它放在這里以防萬一。 如果它無關緊要,管理員可以隨意刪除它,但它確實有效。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

# Define a stream, custom class, that reports data written to it, with a Qt signal
class EmittingStream(QtCore.QObject):

    textWritten = QtCore.pyqtSignal(str)

    def write(self, text):
        self.textWritten.emit(str(text))

class Ui_TableManagerWindow(object):
    def setupUi(self, TableManagerWindow):
        #define all of my widgets, layout, etc here
        .
        .
        .
        # Install a custom output stream by connecting sys.stdout to instance of EmmittingStream.
        sys.stdout = EmittingStream(textWritten=self.output_terminal_written)

        # Create my signal/connections for custom method
        self.source_dir_button.clicked.connect(self.sourceDirButtonClicked)

        self.retranslateUi(TableManagerWindow)
        QtCore.QMetaObject.connectSlotsByName(TableManagerWindow)


    def retranslateUi(self, TableManagerWindow):
        .
        .
        .

    #custom method that prints to output terminal.  The point is to have this emmitted out to my QTextEdit widget.
    def sourceDirButtonClicked(self):
        for i in range(10):
            print("The Source DIR button has been clicked " + str(i) + " times")

    #custom method to write anything printed out to console/terminal to my QTextEdit widget via append function.
    def output_terminal_written(self, text):
        self.output_terminal_textEdit.append(text)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    TableManagerWindow = QtWidgets.QMainWindow()
    ui = Ui_TableManagerWindow()
    ui.setupUi(TableManagerWindow)
    TableManagerWindow.show()
    sys.exit(app.exec_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM