【PyQt】05-多线程


前言

文章开始还是解释一下,这是跟着王铭东老师学习的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是单线程、多线程

单线程
在Python中,单线程是指在程序中只有一个执行线程,它按照顺序逐行执行代码。这意味着每次只能执行一个任务或操作,直到完成后才能执行下一个任务。
单线程模型适用于简单的程序或任务,其中没有太多需要同时处理的操作。在单线程中,代码的执行是以同步的方式进行的,也就是说,每个操作都必须等待前一个操作完成后才能执行。
虽然单线程简单易于理解和实现,但也有一些缺点。当任务变得复杂或需要处理大量计算时,单线程的执行速度可能会变慢。此外,如果一个任务遇到了阻塞(如等待用户输入或网络请求),那么整个程序都将被阻塞,无法执行其他任务。
多线程
是指在程序中同时运行多个线程,每个线程负责执行一个特定的任务或操作。与单线程相比,多线程可以同时处理多个任务,从而提高程序的并发性和响应性能。

在Python中,可以使用内置的threading模块来实现多线程。通过创建Thread类的实例,并将要执行的任务作为线程的目标函数传递给它,可以创建多个并行运行的线程。

二、代码现象

示例

视频中老师给了一个例子,就是在登入中载入延时,然后就动不了。卡在延时那里,于是延伸出多线程的现象来。他给的代码是下面这个。

import sys
import time

from PyQt5.QtWidgets import *
from PyQt5 import uic


class MyWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi("./login.ui")
        # print(self.ui.__dict__)  # 查看ui文件中有哪些控件

        # 提取要操作的控件
        self.user_name_qwidget = self.ui.lineEdit  # 用户名输入框
        self.password_qwidget = self.ui.lineEdit_2  # 密码输入框
 
### PyQt与OpenCV-Python多线程图像显示实现方法 为了在PyQt中使用OpenCV-Python进行多线程图像显示,通常会采用`QThread`来管理摄像头数据采集的任务。这样可以避免主线程被阻塞,从而保持GUI界面的响应性。以下是具体的技术细节: #### 使用QThread分离任务 在PyQt中,直接在主线程中执行耗时操作(如读取摄像头帧)可能会导致UI卡顿甚至无响应。因此,推荐将摄像头捕获逻辑放入子线程中运行。可以通过继承`QThread`类创建一个新的线程对象,并在其内部完成摄像头帧的抓取工作[^1]。 #### 数据传递机制 当子线程成功获取到一帧图像后,需将其发送回主窗口以便更新界面上指定控件的内容。这一步可通过信号槽机制完成:定义一个自定义信号用于携带每张图片的数据;每当新画面准备好就触发该信号并将对应numpy数组作为参数传出去;最后连接此信号至某个插槽函数负责实际渲染过程[^3]。 #### 示例代码展示 下面给出一段完整的示范代码片段说明上述流程是如何工作的: ```python import sys from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget import cv2 class VideoThread(QThread): change_pixmap_signal = pyqtSignal(QImage) def run(self): cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if ret: rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch = rgb_image.shape bytes_per_line = ch * w convert_to_qt_format = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888) p = convert_to_qt_format.scaled(640, 480, Qt.KeepAspectRatio) self.change_pixmap_signal.emit(p) class App(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Qt live label demo") self.disply_width = 640 self.display_height = 480 # create the label that holds the image self.image_label = QLabel(self) self.image_label.resize(self.disply_width, self.display_height) # create a vertical box layout and add the two labels vbox = QVBoxLayout() vbox.addWidget(self.image_label) # set the vbox layout as the widgets layout self.setLayout(vbox) # create the video capture thread self.thread = VideoThread() # connect its signal to the update_image slot self.thread.change_pixmap_signal.connect(self.update_image) # start the thread self.thread.start() @pyqtSlot(QImage) def update_image(self, image): self.image_label.setPixmap(QPixmap.fromImage(image)) if __name__ == "__main__": app = QApplication(sys.argv) win = App() win.show() sys.exit(app.exec_()) ``` 这段脚本展示了如何利用Python结合PyQt框架以及OpenCV库构建简单的实时视频流应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值