PyQt5界面刷新以及多线程更新UI数据实例

it2025-03-14  24

记录一下在项目中遇到的问题。 在UI界面中,一般会有一些控件比如PushButton、Qlabel等用来触发某一个事件,若该事件十分耗时,那么将会阻塞主程序,造成UI界面出现卡顿或者未响应的问题,因此我们必须要使用多线程来解决。 一般按照常规写多线程,即直接传入函数,启动多线程,传入参数这个方法,在PyQt5界面刷新中实现不了,只能用PyQt5中的QThread来写多线程。 问题描述: 编写的上位机程序中,当触发界面上的按钮给下位机发送控制命令时,摄像头画面停止不动,下位机先执行控制命令,待下位机执行完毕,上位机画面迅速显示。问题很显然,程序是并发运行,不能将画面和控制命令同时进行,在一方运行的同时,另一个程序阻塞等待。 解决办法: 加入多线程机制。 由于项目原因,特将个人程序进行删改,不影响运行效果。 注意:本实例需要用到两个库:pyqt5和opencv。 安装方法见此链接:https://blog.csdn.net/zcs_xueli/article/details/105737403 下面这个程序是没有加入多线程的程序,小伙伴们可以直接在电脑运行,感受一下界面卡顿的效果。

下面这个程序是label0.py。 .ui文件转成的.py文件。本实例的程序将界面和逻辑分开编写 # -*- coding: utf-8 -*- from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(648, 734) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 116, 170)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Highlight, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(0, 116, 170)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Highlight, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(51, 153, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Highlight, brush) MainWindow.setPalette(palette) font = QtGui.QFont() font.setPointSize(10) MainWindow.setFont(font) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("C:/Users/Administrator/Desktop/logo.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) MainWindow.setAutoFillBackground(False) MainWindow.setStyleSheet("background-color: rgb(191, 191, 191);") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label_9 = QtWidgets.QLabel(self.centralwidget) self.label_9.setGeometry(QtCore.QRect(180, 0, 271, 51)) font = QtGui.QFont() font.setFamily("宋体") font.setPointSize(22) font.setBold(True) font.setWeight(75) self.label_9.setFont(font) self.label_9.setStyleSheet("background-color: rgb(191, 191, 191);") self.label_9.setObjectName("label_9") self.groupBox_5 = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_5.setGeometry(QtCore.QRect(0, 60, 631, 611)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128)) brush.setStyle(QtCore.Qt.NoBrush) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128)) brush.setStyle(QtCore.Qt.NoBrush) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(191, 191, 191)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128)) brush.setStyle(QtCore.Qt.NoBrush) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush) self.groupBox_5.setPalette(palette) font = QtGui.QFont() font.setFamily("Aharoni") font.setPointSize(11) font.setBold(True) font.setWeight(75) self.groupBox_5.setFont(font) self.groupBox_5.setAcceptDrops(False) self.groupBox_5.setStyleSheet("background-color: rgb(191, 191, 191);") self.groupBox_5.setObjectName("groupBox_5") self.label_show = QtWidgets.QLabel(self.groupBox_5) self.label_show.setGeometry(QtCore.QRect(10, 20, 601, 431)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(103, 103, 103)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(103, 103, 103)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(103, 103, 103)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(200, 200, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Highlight, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128)) brush.setStyle(QtCore.Qt.NoBrush) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(103, 103, 103)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(103, 103, 103)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(103, 103, 103)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(200, 200, 200)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Highlight, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128)) brush.setStyle(QtCore.Qt.NoBrush) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) brush = QtGui.QBrush(QtGui.QColor(103, 103, 103)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(103, 103, 103)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(103, 103, 103)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) brush = QtGui.QBrush(QtGui.QColor(51, 153, 255)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Highlight, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128)) brush.setStyle(QtCore.Qt.NoBrush) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush) self.label_show.setPalette(palette) font = QtGui.QFont() font.setPointSize(35) font.setBold(True) font.setWeight(75) self.label_show.setFont(font) self.label_show.setAutoFillBackground(False) self.label_show.setStyleSheet("background-color: rgb(103, 103, 103);") self.label_show.setText("") self.label_show.setScaledContents(True) self.label_show.setAlignment(QtCore.Qt.AlignCenter) self.label_show.setObjectName("label_show") self.pushButton_open = QtWidgets.QPushButton(self.groupBox_5) self.pushButton_open.setGeometry(QtCore.QRect(40, 470, 81, 31)) font = QtGui.QFont() font.setFamily("Aharoni") font.setPointSize(12) font.setBold(True) font.setWeight(75) self.pushButton_open.setFont(font) self.pushButton_open.setStyleSheet("background-color: rgb(103, 103, 103);") self.pushButton_open.setObjectName("pushButton_open") self.pushButton_1 = QtWidgets.QPushButton(self.groupBox_5) self.pushButton_1.setGeometry(QtCore.QRect(190, 470, 81, 31)) font = QtGui.QFont() font.setFamily("Aharoni") font.setPointSize(12) font.setBold(True) font.setWeight(75) self.pushButton_1.setFont(font) self.pushButton_1.setStyleSheet("background-color: rgb(103, 103, 103);") self.pushButton_1.setObjectName("pushButton_1") self.pushButton_2 = QtWidgets.QPushButton(self.groupBox_5) self.pushButton_2.setGeometry(QtCore.QRect(340, 470, 81, 31)) font = QtGui.QFont() font.setFamily("Aharoni") font.setPointSize(12) font.setBold(True) font.setWeight(75) self.pushButton_2.setFont(font) self.pushButton_2.setStyleSheet("background-color: rgb(103, 103, 103);") self.pushButton_2.setObjectName("pushButton_2") self.pushButton_3 = QtWidgets.QPushButton(self.groupBox_5) self.pushButton_3.setGeometry(QtCore.QRect(500, 470, 81, 31)) font = QtGui.QFont() font.setFamily("Aharoni") font.setPointSize(12) font.setBold(True) font.setWeight(75) self.pushButton_3.setFont(font) self.pushButton_3.setStyleSheet("background-color: rgb(103, 103, 103);") self.pushButton_3.setObjectName("pushButton_3") self.lineEdit = QtWidgets.QLineEdit(self.groupBox_5) self.lineEdit.setGeometry(QtCore.QRect(160, 530, 301, 61)) font = QtGui.QFont() font.setFamily("宋体") font.setPointSize(11) font.setBold(True) font.setWeight(75) self.lineEdit.setFont(font) self.lineEdit.setObjectName("lineEdit") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 648, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "PyQt5界面实时刷新")) self.label_9.setText(_translate("MainWindow", "PyQt5界面实时刷新")) self.groupBox_5.setTitle(_translate("MainWindow", "视频显示")) self.pushButton_open.setText(_translate("MainWindow", "open")) self.pushButton_1.setText(_translate("MainWindow", "数据显示1")) self.pushButton_2.setText(_translate("MainWindow", "数据显示2")) self.pushButton_3.setText(_translate("MainWindow", "数据显示3"))

界面显示如下图,自己随便弄的,不是很美观,主要还是便于理解。

main.py是主程序 #!/usr/bin/env python # -*- coding: utf-8 -*- # Author:xueli # Time: 2020/10/21 import random import threading from datetime import* from label0 import Ui_MainWindow import cv2 import sys import time from PyQt5.QtWidgets import QApplication,QMainWindow,QDialog from PyQt5 import QtCore, QtGui, QtWidgets class mainEntry2(QMainWindow, Ui_MainWindow,QtWidgets.QWidget): def __init__(self): super(mainEntry2,self).__init__() self.setupUi(self) self.timer_camera = QtCore.QTimer() # 定义定时器,用于控制显示视频的帧率 self.cap = cv2.VideoCapture() # 视频流 self.CAM_NUM = 0 # 为0时表示视频流来自笔记本内置摄像头 self.pushButton_open.clicked.connect(self.pushbutton_fuction) self.timer_camera.timeout.connect(self.show_camera) self.pushButton_1.clicked.connect(self.show1) self.pushButton_2.clicked.connect(self.show2) self.pushButton_3.clicked.connect(self.show3) def pushbutton_fuction(self): # pushbutton对应的响应函数 if self.timer_camera.isActive() == False: # 若定时器未启动 flag = self.cap.open(self.CAM_NUM) # 参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频 if flag == False: # flag表示open()成不成功/ pass else: self.timer_camera.start(0.001) # 定时器开始计时1ms,结果是每过1ms从摄像头中取一帧显示 else: self.timer_camera.stop() # 关闭定时器 self.cap.release() # 释放视频流 self.label_show.clear() # 清空视频显示区域 def show_camera(self): flag, self.image = self.cap.read() # 从视频流中读取 show = cv2.resize(self.image, (500, 380)) # 把读到的帧的大小重新设置为 640x480 show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB) # 视频色彩转换回RGB,这样才是现实的颜色 showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888) # 把读取到的视频数据变成QImage形式 self.label_show.setPixmap(QtGui.QPixmap.fromImage(showImage)) # 往显示视频的Label里 显示QImage def show1(self): t1 = time.time() while True: print(random.random()) self.lineEdit.setText(str(random.random())) t = time.time() - t1 if t > 2: break def show2(self): t1 = time.time() while True: self.lineEdit.setText(str(random.random())) print(random.random()) t = time.time() - t1 if t > 2: break def show3(self): t1 = time.time() while True: self.lineEdit.setText(str(random.random())) print(random.random()) t = time.time() - t1 if t > 2: break if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = mainEntry2() t1 = threading.Thread(target=window.show()) t1.start() sys.exit(app.exec_())

运行过上面的程序后,就会发现,界面是相当的卡顿。就会发现以下3个问题: 1、只点击open,开启摄像头,无其他操作,视频很流畅,不卡顿; 2、此时点击数据显示按钮,摄像头卡死,后台有数据打印但是没有更新到界面; 3、等待2秒后,即后台数据打印完毕,摄像头迅速运行,画面快速闪过,界面数据只显示其中一个数据。 为了解决以上出现的问题,用PyQt5中的QThread来写多线程,运行后,会发现视频流畅、界面数据实时更新、后台数据流畅打印。到这一步了,小伙伴们一定要动手试一下呀。 注意:界面程序不变,用的还是label0.py。

#!/usr/bin/env python # -*- coding: utf-8 -*- # Author:xueli # Time: 2020/10/21 import random import threading from datetime import* from label0 import Ui_MainWindow import cv2 from PyQt5.QtWidgets import QApplication,QMainWindow,QDialog from PyQt5 import QtWidgets, QtCore import sys from PyQt5.QtCore import * import time from PyQt5 import QtCore, QtGui, QtWidgets class Runthread(QtCore.QThread): # 通过类成员对象定义信号对象 _signal = pyqtSignal(str) def __init__(self): super(Runthread, self).__init__() def __del__(self): self.wait() def run(self): t1 = time.time() while True: print(random.random()) self._signal.emit(str(random.random())) t = time.time() - t1 if t > 2: break class mainEntry2(QMainWindow, Ui_MainWindow,QtWidgets.QWidget): def __init__(self): super(mainEntry2,self).__init__() self.setupUi(self) self.timer_camera = QtCore.QTimer() # 定义定时器,用于控制显示视频的帧率 self.cap = cv2.VideoCapture() # 视频流 self.CAM_NUM = 0 # 为0时表示视频流来自笔记本内置摄像头 self.pushButton_open.clicked.connect(self.pushbutton_fuction) self.timer_camera.timeout.connect(self.show_camera) self.pushButton_1.clicked.connect(self.show1) self.pushButton_2.clicked.connect(self.show2) self.pushButton_3.clicked.connect(self.show3) def pushbutton_fuction(self): # pushbutton对应的响应函数 if self.timer_camera.isActive() == False: # 若定时器未启动 flag = self.cap.open(self.CAM_NUM) # 参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频 if flag == False: # flag表示open()成不成功/ pass else: self.timer_camera.start(0.001) # 定时器开始计时1ms,结果是每过1ms从摄像头中取一帧显示 else: self.timer_camera.stop() # 关闭定时器 self.cap.release() # 释放视频流 self.label_show.clear() # 清空视频显示区域 def show_camera(self): flag, self.image = self.cap.read() # 从视频流中读取 show = cv2.resize(self.image, (500, 380)) # 把读到的帧的大小重新设置为 640x480 show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB) # 视频色彩转换回RGB,这样才是现实的颜色 showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888) # 把读取到的视频数据变成QImage形式 self.label_show.setPixmap(QtGui.QPixmap.fromImage(showImage)) # 往显示视频的Label里 显示QImage def show1(self): # 创建线程 self.thread = Runthread() # 连接信号 self.thread._signal.connect(self.call_backlog) # 进程连接回传到GUI的事件 # 开始线程 self.thread.start() def show2(self): # 创建线程 self.thread = Runthread() # 连接信号 self.thread._signal.connect(self.call_backlog) # 进程连接回传到GUI的事件 # 开始线程 self.thread.start() def show3(self): # 创建线程 self.thread = Runthread() # 连接信号 self.thread._signal.connect(self.call_backlog) # 进程连接回传到GUI的事件 # 开始线程 self.thread.start() def call_backlog(self, msg): self.lineEdit.setText(msg) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = mainEntry2() t1 = threading.Thread(target=window.show()) t1.start() sys.exit(app.exec_())

基于项目中遇到的问题进行改写的程序,写程序就是要多想、多敲、多试验。博主虽不是计算机专业,但是接触编程久了,就会觉得敲代码是一件很有趣的事情。 如有不懂的问题,欢迎私信,当然更欢迎大佬前来批评指点!!!

最新回复(0)