Как перенаправить вывод скрипта Python на консоль графического интерфейса PyQT5 без каких-либо нажатий кнопок?

Эй, я использую тот же старый код для получения всего кода, выводимого консолью GUI PyQT5 QTexBrowser, но я также получаю символ следующей строки (\n) во всех новых строках.

URL-адрес кода — передает вывод из sys.stdout в текстовый браузер в pyqt

Ниже приведен код, который я использую из приведенного выше URL-адреса -

class Port(object):
    def __init__(self, view):
        self.view = view

    def write(self, *args):
        # self.view.append(str([*args]))
        # self.view.append(str(*args).rstrip("\n").lstrip("\n"))
        self.view.append(*args)

Вывод консоли GUI — введите здесь описание изображения

Есть ли способ удалить "\n" из аргументов, пожалуйста, предложите.

когда я использовал строку ниже, я смог увидеть, что в каждом новом аргументе есть "\n".

self.view.append(str([*args]))

Вывод консоли GUI с видимым "\n" (* Игнорируйте числа в строках в качестве первого символа — это часть вывода выбора пользователя.) введите здесь описание изображения

затем я попытался всеми возможными способами удалить, например, strip(), lstrip() и т. д., но все равно не добился успеха.

Ниже приведена часть кода, как я перенаправляю вывод времени выполнения на QtextBrowser

        self.execution_result = QtWidgets.QWidget()
        self.execution_result.setObjectName("execution_result")

        self.execution_rslt_saveresult_btn = QtWidgets.QPushButton(self.execution_result)
        self.execution_rslt_saveresult_btn.setGeometry(QtCore.QRect(1220, 780, 131, 25))
        self.execution_rslt_saveresult_btn.setObjectName("execution_rslt_saveresult_btn")
# ------------------------------------------------------------------------------------------------------#
#                   Console Output
# ------------------------------------------------------------------------------------------------------#
        self.execution_rslt_textbrowser = QtWidgets.QTextBrowser(self.execution_result)
        self.execution_rslt_textbrowser.setGeometry(QtCore.QRect(2, 1, 1371, 771))
        self.execution_rslt_textbrowser.setObjectName("execution_rslt_textbrowser")

        self.execution_rslt_textbrowser.setStyleSheet(
            """QTextBrowser {background-color:  #000000;
                               color: #00FF00;
                               font: 11pt Courier new;}""")
        self.execution_rslt_textbrowser.document().setPlainText(
            "-" * 40 + '\n' + "     Log starts from below line   " + '\n' + "-" * 40)
# ------------------------------------------------------------------------------------------------------#
# Below line is sending run time output to GUI console
# ------------------------------------------------------------------------------------------------------#
        sys.stdout = Port(self.execution_rslt_textbrowser)

Пожалуйста, подскажите, что мне делать здесь, чтобы удалить "\n" из выходных строк. также как убрать ошибку AttributeError: 'port' object has no attribute 'flush'

Ниже приведен рабочий пример кода с проблемой символа следующей строки. – Для справки/отладки

from PyQt5 import QtCore, QtGui, QtWidgets
import sys


class Port(object):
    def __init__(self, view):
        self.view = view

    def flush(self):
        pass

    def write(self, *args):
        # self.view.append(str([*args])) # This line will highlight next line character in console "\n"
        self.view.append(*args)


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        # MainWindow.setEnabled(True)
        MainWindow.resize(1000, 500)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMinimumSize(QtCore.QSize(1000, 500))
        MainWindow.setMaximumSize(QtCore.QSize(1000, 500))
        MainWindow.setBaseSize(QtCore.QSize(1000, 500))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setMinimumSize(QtCore.QSize(0, 883))
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(280, 0, 671, 341))
        self.tabWidget.setTabPosition(QtWidgets.QTabWidget.North)
        self.tabWidget.setTabShape(QtWidgets.QTabWidget.Rounded)
        self.tabWidget.setDocumentMode(False)
        self.tabWidget.setTabsClosable(False)
        self.tabWidget.setObjectName("tabWidget")


        self.execution_result = QtWidgets.QWidget()
        self.execution_result.setObjectName("execution_result")
        self.execution_rslt_textbrowser = QtWidgets.QTextBrowser(self.execution_result)
        self.execution_rslt_textbrowser.setGeometry(QtCore.QRect(1, 1, 681, 321))
        self.execution_rslt_textbrowser.setObjectName("execution_rslt_textbrowser")
        self.execution_rslt_textbrowser.document().setPlainText(
            "-" * 40 + '\n' + "     Log starts from below line   " + '\n' + "-" * 40)

# ----------------------------------------------------------------------------#
#               Console Output Redirection
# ----------------------------------------------------------------------------#
        sys.stdout = Port(self.execution_rslt_textbrowser)
# ----------------------------------------------------------------------------#


        self.tabWidget.addTab(self.execution_result, "")
        self.mainwindow_list = QtWidgets.QListWidget(self.centralwidget)
        self.mainwindow_list.setGeometry(QtCore.QRect(20, 30, 241, 301))
        self.mainwindow_list.setObjectName("mainwindow_list")

        self.mainwindow_list.itemClicked['QListWidgetItem*'].connect(self.qlistoptions)

        item = QtWidgets.QListWidgetItem()
        font = QtGui.QFont()
        font.setPointSize(9)
        item.setFont(font)
        self.mainwindow_list.addItem(item)
        item = QtWidgets.QListWidgetItem()
        font = QtGui.QFont()
        font.setPointSize(9)
        item.setFont(font)
        self.mainwindow_list.addItem(item)
        item = QtWidgets.QListWidgetItem()
        font = QtGui.QFont()
        font.setPointSize(9)
        item.setFont(font)
        self.mainwindow_list.addItem(item)
        item = QtWidgets.QListWidgetItem()
        font = QtGui.QFont()
        font.setPointSize(9)
        item.setFont(font)
        self.mainwindow_list.addItem(item)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.execution_result), _translate("MainWindow", "Execution Console"))

        __sortingEnabled = self.mainwindow_list.isSortingEnabled()
        self.mainwindow_list.setSortingEnabled(False)
        item = self.mainwindow_list.item(0)
        item.setText(_translate("MainWindow", "Item1"))
        item = self.mainwindow_list.item(1)
        item.setText(_translate("MainWindow", "Item2"))
        item = self.mainwindow_list.item(2)
        item.setText(_translate("MainWindow", "Item3"))
        item = self.mainwindow_list.item(3)
        item.setText(_translate("MainWindow", "Item4"))
        self.mainwindow_list.setSortingEnabled(__sortingEnabled)


    def qlistoptions(self):
        print("Inside qlistoptions method : Button Clicked")
        # window.hide()  ## This to close main window and open new window.
        print(self.mainwindow_list.currentRow())  # Will Return Index number of list item
        print(self.mainwindow_list.currentItem().text())  # Will Return current selected text from list item
        # print("Signal-", self.mainwindow_ok.isChecked())

        # Item1
        if self.mainwindow_list.currentRow() == 0:
            print("Item1 is Clicked!!")
        # Item2
        elif self.mainwindow_list.currentRow() == 1:
            print("Item2 is Clicked!!")
        # Item3
        elif self.mainwindow_list.currentRow() == 2:
            print("Item3 is Clicked!!")
        # Item4
        elif self.mainwindow_list.currentRow() == 3:
            print("Item4 is Clicked!!")
        else:
            print("Please select any item first!!")

    def printText(self, button):
        print("Value from printText Method -")
        print(button.text())


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()

    sys.exit(app.exec_())


person user1782212    schedule 27.07.2020    source источник
comment
предоставьте минимальный воспроизводимый пример   -  person eyllanesc    schedule 27.07.2020
comment
Привет @eyllanesc образец воспроизводимого кода был добавлен для справки. Пожалуйста, проверьте.   -  person user1782212    schedule 27.07.2020


Ответы (2)


Метод append добавляет дополнительную конечную строку, решение состоит в том, чтобы вставить текст, не добавляя его:

class Port(object):
    def __init__(self, view):
        self.view = view

    def flush(self):
        pass

    def write(self, text):
        cursor = self.view.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.view.setTextCursor(cursor)
        self.view.ensureCursorVisible()
person eyllanesc    schedule 27.07.2020
comment
Привет @eyllanesc Потрясающе!!! это решило проблему .. Большое спасибо!! - person user1782212; 27.07.2020

Пишу командой: sys.stdout.write("Append a line to console!"), все хорошо, ничего лишнего.

Чтобы удалить ошибку атрибута сброса, просто добавьте в свой класс порта эту функцию переопределения:

def flush(self):
    pass

Проверено!

person protoproto    schedule 27.07.2020
comment
Большое спасибо... def flush(self) удалил ошибку AttributeError: 'port' object has no attribute 'flush' Но проблема с новой строкой все еще существует.... Я использую sys.stdout = Port(self.execution_rslt_textbrowser) для вызова метода def write(self, *args): и там self.view.append(str([*args])) строка добавляет данные в консоль, но с \n .... К sys.stdout.write("Append a line to console!") я могу вывести данные на консоль, но мне нужны все аргументы, сгенерированные моим кодом. :( , дайте мне знать, если есть какие-либо другие предложения. - person user1782212; 27.07.2020