Search code examples
pythonpyqtpyqt4qtextedit

Print out Python console output to Qtextedit


I have the output like this, when I press the button:

['VERSION', 'ROMMON', 'HOSTNAME', 'UPTIME', 'RUNNING_IMAGE', 'HARDWARE', 'SERIAL', 'CONFIG_REGISTER']

['12.2(55)SE7', 'Bootstrap', 'Revo-Solusindo-01', '1 hour, 27 minutes', 'c2960s-universalk9-mz.122-55.SE7.bin', ['WS-C2960S-24PD-L'], ['FOC1644Z129'], '0xF'] Write 1 records

['FAN', 'TEMPERATURE', 'TEMPERATURE_VALUE', 'TEMPERATURE_STATE', 'YELLOW_THRESHOLD', 'RED_THRESHOLD', 'POWER', 'RPS']

['OK', 'OK', '33', 'GREEN', '54', '64', '', ''] Write 1 records

['TOTAL', 'FFREE']

['57931776', '29178368']

['524288', '523212'] Write 2 records

['MEMTYPE', 'HEAD', 'TOTAL', 'USED', 'FREE', 'LOW', 'LARGE']

['Processor', '2BA9598', '73910760', '26908308', '47002452', '45367928', '30211716']

[' I/O', '6200000', '14680064', '12406764', '2273300', '2273300', '2273024']

['Driver te', '1A00000', '1048576', '44', '1048532', '1048532', '1048532'] Write 3 records

['CPU_5_SEC', 'CPU_1_MIN', 'CPU_5_MIN']

['10', '10', '9'] Write 1 records

How can I print the output of the background process to Qtextedit?

My code:

import sys
from PyQt4 import QtGui, QtCore
import jtextfsm as textfsm

class Window(QtGui.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle("PyQT tuts!")
        self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))
        self.home()

    def home(self):
        btn = QtGui.QPushButton("Generate", self)
        btn.clicked.connect(self.TextFSM)
        btn.resize(100, 50)
        btn.move(50, 50)

        process  = QtGui.QTextEdit(self)
        process.moveCursor(QtGui.QTextCursor.Start)
        process.ensureCursorVisible()
        process.setLineWrapColumnOrWidth(500)
        process.setLineWrapMode(QtGui.QTextEdit.FixedPixelWidth)
        process.setFixedWidth(400)
        process.setFixedHeight(150)
        process.move(50,100)

        self.show()

    def TextFSM(self):

        nameFile = 'Switch'

        try:
            input_file = open(nameFile + '.txt', encoding='utf-8')  # show version
            raw_text_data = input_file.read()
            input_file.close()

            input_file2 = open(nameFile + '.txt', encoding='utf-8')  # show env
            raw_text_data2 = input_file2.read()
            input_file2.close()

            input_file3 = open(nameFile + '.txt', encoding='utf-8')  # show flash
            raw_text_data3 = input_file3.read()
            input_file3.close()

            input_file4 = open(nameFile + '.txt', encoding='utf-8')  # show memory statistic
            raw_text_data4 = input_file4.read()
            input_file4.close()

            input_file5 = open(nameFile + '.txt', encoding='utf-8')  # show process cpu
            raw_text_data5 = input_file5.read()
            input_file5.close()

            template = open("show-version.textfsm")  # show version
            re_table = textfsm.TextFSM(template)
            fsm_results = re_table.ParseText(raw_text_data)

            template2 = open("show-env.textfsm")  # show env
            re_table2 = textfsm.TextFSM(template2)
            fsm_results2 = re_table2.ParseText(raw_text_data2)

            template3 = open("show-flash.textfsm")  # show flash
            re_table3 = textfsm.TextFSM(template3)
            fsm_results3 = re_table3.ParseText(raw_text_data3)

            template4 = open("show-memory-statistic.textfsm")  # show memory statistic
            re_table4 = textfsm.TextFSM(template4)
            fsm_results4 = re_table4.ParseText(raw_text_data4)

            template5 = open("show-process-cpu.textfsm")  # show process cpu
            re_table5 = textfsm.TextFSM(template5)
            fsm_results5 = re_table5.ParseText(raw_text_data5)

            outfile_name = open(nameFile + "-show-version.csv", "w+")  # show version
            outfile = outfile_name

            outfile_name2 = open(nameFile + "-show-env.csv", "w+")  # show env
            outfile2 = outfile_name2

            outfile_name3 = open(nameFile + "-show-flash.csv", "w+")  # show flash
            outfile3 = outfile_name3

            outfile_name4 = open(nameFile + "-show-memory-statistic.csv", "w+")  # show memory statistic
            outfile4 = outfile_name4

            outfile_name5 = open(nameFile + "-show-process-cpu.csv", "w+")  # show process cpu
            outfile5 = outfile_name5

            print(re_table.header)  # show version
            for s in re_table.header:
                outfile.write("%s;" % s)
            outfile.write("\n")

            counter = 0
            for row in fsm_results:  # show version
                print(row)
                for s in row:
                    outfile.write("%s;" % s)
                outfile.write("\n")
                counter += 1
            print("Write %d records" % counter)

            print(re_table2.header)  # show env
            for s in re_table2.header:
                outfile2.write("%s;" % s)
            outfile2.write("\n")

            counter = 0
            for row in fsm_results2:  # show env
                print(row)
                for s in row:
                    outfile2.write("%s;" % s)
                outfile2.write("\n")
                counter += 1
            print("Write %d records" % counter)

            print(re_table3.header)  # show flash
            for s in re_table3.header:
                outfile3.write("%s;" % s)
            outfile3.write("\n")

            counter = 0
            for row in fsm_results3:  # show flash
                print(row)
                for s in row:
                    outfile3.write("%s;" % s)
                outfile3.write("\n")
                counter += 1
            print("Write %d records" % counter)

            print(re_table4.header)  # show memory statistics
            for s in re_table4.header:
                outfile4.write("%s;" % s)
            outfile4.write("\n")

            counter = 0
            for row in fsm_results4:  # show memory statistics
                print(row)
                for s in row:
                    outfile4.write("%s;" % s)
                outfile4.write("\n")
                counter += 1
            print("Write %d records" % counter)

            print(re_table5.header)  # show process cpu
            for s in re_table5.header:
                outfile5.write("%s;" % s)
            outfile5.write("\n")

            counter = 0
            for row in fsm_results5:  # show process cpu
                print(row)
                for s in row:
                    outfile5.write("%s;" % s)
                outfile5.write("\n")
                counter += 1
            print("Write %d records" % counter)
        except IOError:
            print("Error: There Have File does not appear to exist.")
            QtGui.QMessageBox.question(self, 'Warning', "ERROR:Please check you're '.txt' file and TextFSM File.")


def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())


run()

Solution

  • The output consoles produced by Python are written to the program output streams sys.stdout (normal output) and sys.stderr (error output, such as exception tracebacks). In this case we will use stdout

    class Stream(QtCore.QObject):
        newText = QtCore.pyqtSignal(str)
    
        def write(self, text):
            self.newText.emit(str(text))
    
    class Window(QtGui.QMainWindow):
        def __init__(self):
            super(Window, self).__init__()
            self.setGeometry(50, 50, 500, 300)
            self.setWindowTitle("PyQT tuts!")
            self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))
            self.home()
    
            sys.stdout = Stream(newText=self.onUpdateText)
    
        def onUpdateText(self, text):
            cursor = self.process.textCursor()
            cursor.movePosition(QtGui.QTextCursor.End)
            cursor.insertText(text)
            self.process.setTextCursor(cursor)
            self.process.ensureCursorVisible()
    
        def __del__(self):
            sys.stdout = sys.__stdout__
    

    Complete code:

    import sys
    from PyQt4 import QtGui, QtCore
    import jtextfsm as textfsm
    
    
    class Stream(QtCore.QObject):
        newText = QtCore.pyqtSignal(str)
    
        def write(self, text):
            self.newText.emit(str(text))
    
    class Window(QtGui.QMainWindow):
        def __init__(self):
            super(Window, self).__init__()
            self.setGeometry(50, 50, 500, 300)
            self.setWindowTitle("PyQT tuts!")
            self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))
            self.home()
    
            sys.stdout = Stream(newText=self.onUpdateText)
    
        def onUpdateText(self, text):
            cursor = self.process.textCursor()
            cursor.movePosition(QtGui.QTextCursor.End)
            cursor.insertText(text)
            self.process.setTextCursor(cursor)
            self.process.ensureCursorVisible()
    
        def __del__(self):
            sys.stdout = sys.__stdout__
    
        def home(self):
    
            w = QtGui.QWidget()
            self.setCentralWidget(w)
            lay = QtGui.QVBoxLayout(w)
            btn = QtGui.QPushButton("Generate")
            btn.clicked.connect(self.TextFSM)
    
            self.process  = QtGui.QTextEdit()
            self.process.moveCursor(QtGui.QTextCursor.Start)
            self.process.ensureCursorVisible()
            self.process.setLineWrapColumnOrWidth(500)
            self.process.setLineWrapMode(QtGui.QTextEdit.FixedPixelWidth)
    
            lay.addWidget(btn)
            lay.addWidget(self.process)
    
            self.show()
    
        def TextFSM(self):
    
            nameFile = 'Switch'
    
            try:
                input_file = open(nameFile + '.txt', encoding='utf-8')  # show version
                raw_text_data = input_file.read()
                input_file.close()
    
                input_file2 = open(nameFile + '.txt', encoding='utf-8')  # show env
                raw_text_data2 = input_file2.read()
                input_file2.close()
    
                input_file3 = open(nameFile + '.txt', encoding='utf-8')  # show flash
                raw_text_data3 = input_file3.read()
                input_file3.close()
    
                input_file4 = open(nameFile + '.txt', encoding='utf-8')  # show memory statistic
                raw_text_data4 = input_file4.read()
                input_file4.close()
    
                input_file5 = open(nameFile + '.txt', encoding='utf-8')  # show process cpu
                raw_text_data5 = input_file5.read()
                input_file5.close()
    
                template = open("show-version.textfsm")  # show version
                re_table = textfsm.TextFSM(template)
                fsm_results = re_table.ParseText(raw_text_data)
    
                template2 = open("show-env.textfsm")  # show env
                re_table2 = textfsm.TextFSM(template2)
                fsm_results2 = re_table2.ParseText(raw_text_data2)
    
                template3 = open("show-flash.textfsm")  # show flash
                re_table3 = textfsm.TextFSM(template3)
                fsm_results3 = re_table3.ParseText(raw_text_data3)
    
                template4 = open("show-memory-statistic.textfsm")  # show memory statistic
                re_table4 = textfsm.TextFSM(template4)
                fsm_results4 = re_table4.ParseText(raw_text_data4)
    
                template5 = open("show-process-cpu.textfsm")  # show process cpu
                re_table5 = textfsm.TextFSM(template5)
                fsm_results5 = re_table5.ParseText(raw_text_data5)
    
                outfile_name = open(nameFile + "-show-version.csv", "w+")  # show version
                outfile = outfile_name
    
                outfile_name2 = open(nameFile + "-show-env.csv", "w+")  # show env
                outfile2 = outfile_name2
    
                outfile_name3 = open(nameFile + "-show-flash.csv", "w+")  # show flash
                outfile3 = outfile_name3
    
                outfile_name4 = open(nameFile + "-show-memory-statistic.csv", "w+")  # show memory statistic
                outfile4 = outfile_name4
    
                outfile_name5 = open(nameFile + "-show-process-cpu.csv", "w+")  # show process cpu
                outfile5 = outfile_name5
    
                print(re_table.header)  # show version
                for s in re_table.header:
                    outfile.write("%s;" % s)
                outfile.write("\n")
    
                counter = 0
                for row in fsm_results:  # show version
                    print(row)
                    for s in row:
                        outfile.write("%s;" % s)
                    outfile.write("\n")
                    counter += 1
                print("Write %d records" % counter)
    
                print(re_table2.header)  # show env
                for s in re_table2.header:
                    outfile2.write("%s;" % s)
                outfile2.write("\n")
    
                counter = 0
                for row in fsm_results2:  # show env
                    print(row)
                    for s in row:
                        outfile2.write("%s;" % s)
                    outfile2.write("\n")
                    counter += 1
                print("Write %d records" % counter)
    
                print(re_table3.header)  # show flash
                for s in re_table3.header:
                    outfile3.write("%s;" % s)
                outfile3.write("\n")
    
                counter = 0
                for row in fsm_results3:  # show flash
                    print(row)
                    for s in row:
                        outfile3.write("%s;" % s)
                    outfile3.write("\n")
                    counter += 1
                print("Write %d records" % counter)
    
                print(re_table4.header)  # show memory statistics
                for s in re_table4.header:
                    outfile4.write("%s;" % s)
                outfile4.write("\n")
    
                counter = 0
                for row in fsm_results4:  # show memory statistics
                    print(row)
                    for s in row:
                        outfile4.write("%s;" % s)
                    outfile4.write("\n")
                    counter += 1
                print("Write %d records" % counter)
    
                print(re_table5.header)  # show process cpu
                for s in re_table5.header:
                    outfile5.write("%s;" % s)
                outfile5.write("\n")
    
                counter = 0
                for row in fsm_results5:  # show process cpu
                    print(row)
                    for s in row:
                        outfile5.write("%s;" % s)
                    outfile5.write("\n")
                    counter += 1
                print("Write %d records" % counter)
            except IOError:
                print("Error: There Have File does not appear to exist.")
                QtGui.QMessageBox.question(self, 'Warning', "ERROR:Please check you're '.txt' file and TextFSM File.")
    
    
    def run():
        app = QtGui.QApplication(sys.argv)
        GUI = Window()
        sys.exit(app.exec_())
    
    
    run()
    

    Screenshot:

    enter image description here