Print out Python console output to Qtextedit

15,523

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

Share:
15,523
Nedy Suprianto
Author by

Nedy Suprianto

Just a man who wants to live happy :)

Updated on June 05, 2022

Comments

  • Nedy Suprianto
    Nedy Suprianto almost 2 years

    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()
    
  • Nedy Suprianto
    Nedy Suprianto almost 7 years
    how if i have another function that run similar output like the example above it will automatically added to QLineText?
  • eyllanesc
    eyllanesc almost 7 years
    Exactly, all output you print will be sent to QTextEdit
  • Nedy Suprianto
    Nedy Suprianto almost 7 years
    Ok", its work well.. Thankss btw, with my previously post i know how to calculate the time(each tasks) required.. i'm using time to get how long it's running.. it's right?