在QtDesigner中或者直接在py文件中写入一个相当于显示程序运行输出结果的文本框控件,例如textEdit,textBrowser。采用Pyqt中的信号机制,所有信息用信号发送出去,在用信号函数接收,连接槽函数再显示
class EmittingStr(QtCore.QObject):
textWritten = QtCore.pyqtSignal(str) #定义一个发送str的信号
def write(self, text):
self.textWritten.emit(str(text))
sys.stdout = EmittingStream(textWritten=self.outputWritten)
sys.stderr = EmittingStream(textWritten=self.outputWritten)
def outputWritten(self, text):
cursor = self.textBrowser.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.insertText(text)
self.textBrowser.setTextCursor(cursor)
self.textBrowser.ensureCursorVisible()
1.界面文件Ui_ControlBoard.py源代码
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'Ui_ControlBoard.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(600, 700)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(50, 180, 500, 300))
self.textBrowser.setObjectName("textBrowser")
#下面是界面按钮的代码,因为我并不需要按钮,输出结果直接显示所以就注释掉了
#self.pushButton = QtWidgets.QPushButton(self.centralwidget)
#self.pushButton.setGeometry(QtCore.QRect(450, 390, 93, 28))
#self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 400, 200))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
#因为我自己有两个py文件都用到了这个界面文件,且标题不同,所以下面的代码我单独用在了逻辑文件中。
#MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
#self.pushButton.setText(_translate("MainWindow", "PushButton"))
2.逻辑文件,就是输出代码的文件
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from PyQt5 import QtCore, QtGui
import sys
from PyQt5.QtCore import QEventLoop, QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow
from Ui_ControlBoard import Ui_MainWindow
class EmittingStr(QtCore.QObject):
textWritten = QtCore.pyqtSignal(str) #定义一个发送str的信号
def write(self, text):
self.textWritten.emit(str(text))
class ControlBoard(QMainWindow, Ui_MainWindow):
def __init__(self):
super(ControlBoard, self).__init__()
self.setupUi(self)
# 下面将输出重定向到textBrowser中
sys.stdout = EmittingStr(textWritten=self.outputWritten)
sys.stderr = EmittingStr(textWritten=self.outputWritten)
#有按钮的话,下面的就不要注释掉
#self.pushButton.clicked.connect(self.bClicked)
'''界面标题,对应界面文件最后注销掉的两行代码。两者选其一撤掉注销
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "发送端"))
#self.pushButton.setText(_translate("MainWindow", "PushButton"))
'''
def outputWritten(self, text):
cursor = self.textBrowser.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.insertText(text)
self.textBrowser.setTextCursor(cursor)
self.textBrowser.ensureCursorVisible()
'''这是最常用的格式,如果有按钮的话,下面的就是按钮的功能
def bClicked(self):
"""Runs the main function."""
print('Begin')
self.printABCD()
print("End")
def printABCD(self):
print("aaaaaaaaaaaaaaaa")
print("bbbbbbbbbbbbbbbb")
print("cccccccccccccccc")
print("dddddddddddddddd")
'''
#无按钮,下面是自动显示输出的情况
这里就放自己的输出代码所在的功能代码
if __name__ == "__main__":
app = QApplication(sys.argv)
win = ControlBoard()
win.show()
sys.exit(app.exec_())
比较好的是,输出信息的时候不是全部输出完毕,才整个搬到界面上,而是一条条输出。
逻辑文件中,功能模块放置的位置废了好大的功夫,后来请教了学长。学长说我 输出信息的主要代码 与gui界面都是循环, 不能简单地合并, 解决办法是用多线程, 把 输出信息主要代码 的部分作为gui的子线程处理
添加链接描述
添加链接描述
添加链接描述
添加链接描述