PyQt5------将控制台输出到 QTextEdit

需求

如何把控制台中print的内容,输出在 QTextEdit组件中。

过程

# 注意!!!这个文件的导入形式一定是这样!!!!
from PyQt5.QtGui import QTextCursor

from main import f
import frozen_dir
from PyQt5.uic.properties import QtGui
import os, sys, re
from PyQt5.QtWidgets import QApplication, QWidget
from ui_Widget import Ui_Widget
from PyQt5.QtWidgets import QFileDialog
import os
import h5py
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSlot, QTimer, QEventLoop, QObject, pyqtSignal

#
base = frozen_dir.app_path()
mf4path = '{}\\src\\file\\mf4\\'.format(base)
mf43 = '{}\\src\\file\\mf4'.format(base)
h53 = '{}\\src\\file\\h5'.format(base)
csv3 = '{}\\src\\file\\csv'.format(base)


@pyqtSlot(str)
class Stream(QObject):
    newText = pyqtSignal(str)

    def write(self, text):
        self.newText.emit(str(text))
        QApplication.processEvents()


class QmyWidget(QWidget, Ui_Widget):

    def __init__(self):
        # 调用父类构造函数,创建QWidget窗体
        super(QmyWidget, self).__init__()

        # 创建UI对象
        # self.ui = Ui_Widget
        # 构造UI
        self.setupUi(self)
        # 下面将输出重定向到textEdit中
        # sys.stdout 与 print的作用基本类似,可以看作print就是sys.stdout的进一步封装
        # print 会调用 sys.stdout 的 write 方法以下两行在事实上等价:
        # sys.stdout.write('hello'+'\n')
        # print 'hello'
        sys.stdout = Stream(newText=self.onUpdateText)

        # 绑定事件
        # TAB Single处理文件
        self.btnH5.clicked.connect(self.on_btnH5)
        self.btnMF4.clicked.connect(self.on_btnMF4)
        self.btnCsv.clicked.connect(self.on_btnCsv)
        self.btnOK.clicked.connect(self.on_btnOK)

        # TAB Batch批量处理文件
        self.btnH5_3.clicked.connect(self.on_btnH5_3)
        self.btnMF4_3.clicked.connect(self.on_btnMF4_3)
        self.btnCsv_3.clicked.connect(self.on_btnCsv_3)
        self.btnOK_3.clicked.connect(self.on_btnOK_3)

        # 显示H5文件的Dataset_name 也就是key:
        self.btnKeyShow.clicked.connect(self.on_btnKeyShow)

    def onUpdateText(self, text):
        """Write console output to text widget."""
        # self.textEdit.clear()
        """keyShow 是我自定义的TextEdit命名"""
        cursor = self.keyShow.textCursor()
        cursor.movePosition(QTextCursor.End)
        cursor.insertText(text)
        self.keyShow.setTextCursor(cursor)
        self.keyShow.ensureCursorVisible()

    def on_btnMF4(self):
        # 批量选择文件
        self.file = QFileDialog.getExistingDirectory(self, '请选取文件夹', "src/file")
        self.fileList1 = os.listdir(self.file)
        for i in self.fileList1:
            self.textBrowser_mf4.append(i)

    def on_btnMF4_3(self):
        # 选取文件,在指定文件夹选取
        self.file = QFileDialog.getExistingDirectory(self, '请选取文件夹', "src/file")
        print(self.file)
        # self.fileList2 = os.listdir(self.file)
        self.textBrowser_2.setText(self.file)

    def on_btnH5(self):
        # 批量选择文件
        self.file = QFileDialog.getExistingDirectory(self, '请选取文件夹', "src/file/")
        self.fileList2 = os.listdir(self.file)
        for i in self.fileList2:
            self.textBrowser_h5.append(i)

    def on_btnH5_3(self):
        # 选取文件,在指定文件夹选取
        filename, filetype = QFileDialog.getOpenFileName(self, '请选取文件', h53, "Text Files(*.h5)")
        print(filename)
        self.lineEdit.setText(filename)

    def on_btnCsv(self):
        # 批量选择文件
        self.file = QFileDialog.getExistingDirectory(self, '请选取文件夹', "src/file")
        self.fileList3 = os.listdir(self.file)
        for i in self.fileList3:
            self.textBrowser_csv.append(i)

    def on_btnCsv_3(self):
        filename, filetype = QFileDialog.getOpenFileName(self, '请选取文件', csv3, "Text Files(*.csv)")
        print(filename)
        self.lineEdit_3.setText(filename)

    def on_btnOK(self):

        # 遍历文件夹中的每个文件 执行n次函数f()
        for h5, mf4, csv in zip(self.fileList2, self.fileList1, self.fileList3):
            f('src/file/h5/' + h5, 'src/file/mf4/' + mf4, 'src/file/csv/' + csv)

    # 显示h5文件的key值,也就是dataset_name:
    def on_btnKeyShow(self, text):
        

        with h5py.File(self.lineEdit.text(), 'r+') as hdf:
            # 打印 KeysViewHDF5 H5文件的键 CamF20262964
            # f_handler = open('out.log', 'w')
            # sys.stdout = f_handler
            print(hdf.keys())

    def on_btnOK_3(self):
        # textBrowser类型的文本框,要用.show()显示出来。

        f(self.lineEdit.text(), self.file,
          self.lineEdit_3.text(), self.dateset.text())
        print('Hello,Execute is down~')


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    # app = QtWidgets.QApplication(sys.argv)
    ui = QmyWidget()
    ui.show()
    sys.exit(app.exec_())

结果

image

参考博客
参考博客
ps:第二个博客参考方法没太看懂,有空再试试~

posted @ 2021-06-01 17:41  poowicat  阅读(2906)  评论(0编辑  收藏  举报