首先我们拉一个界面出来,懒为方便演示,我们打开Qtdesigner,新建个框,往里面拉一个QTextBrowser和两个QPushButton就好,然后ui转py,界面文件test_ui.py就完成了,转换后的代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'test_ui.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(577, 555)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(20, 10, 361, 491))
self.textBrowser.setObjectName("textBrowser")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(430, 40, 93, 28))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(430, 140, 93, 28))
self.pushButton_2.setObjectName("pushButton_2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 577, 26))
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
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "start"))
self.pushButton_2.setText(_translate("MainWindow", "stop"))
然后在主文件Log.py中导入界面文件,编写这个输出日志程序的思路如下是这样的,首先自定义一个线程类,并在其内部定义一个信号trigger和函数run_,当调用run_的时候往信号trigger发送消息,当信号tirgger接收到消息时将消息显示在控件QTextBrowser中。
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from test_ui import Ui_MainWindow
import time
import random
class MyThread(QThread):
#设置线程变量
trigger = pyqtSignal(str)
def __init__(self, parent=None):
super(MyThread, self).__init__(parent)
def run_(self, message):
'''
向信号trigger发送消息
'''
self.trigger.emit(message)
class Main(QMainWindow,Ui_MainWindow):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.start)
self.pushButton_2.clicked.connect(self.stop)
self.threads = MyThread(self) #自定义线程类
self.threads.trigger.connect(self.update_text) #当信号接收到消息时,更新数据
self.thread_no = 0 #序号
def start(self):
'''
当点击start按键时日志栏中应显示start:序号
'''
self.thread_no += 1
message = "start:{0}".format(self.thread_no)
self.threads.run_(message) # start the thread
def stop(self):
'''
当点击stop按键时日志栏中应显示stop:序号
'''
self.thread_no += 1
message = "stop:{0}".format(self.thread_no)
self.threads.run_(message) # start the thread
def update_text(self, message):
'''
添加信息到日志栏中(即控件QTextBrowser中)
'''
self.textBrowser.append(message)
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = Main()
mainWindow.show()
sys.exit(app.exec_())