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:第二個博客參考方法沒太看懂,有空再試試~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM