【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  # 密码输入框
        self.login_btn = self.ui.pushButton  # 登录按钮
        self.forget_password_btn = self.ui.pushButton_2  # 忘记密码按钮
        self.textBrowser = self.ui.textBrowser  # 文本显示区域

        # 绑定信号与槽函数
        self.login_btn.clicked.connect(self.login)

    def login(self):
        """登录按钮的槽函数"""
        user_name = self.user_name_qwidget.text()
        password = self.password_qwidget.text()

        for i in range(10):
            print("正在登录服务器....%d" % (i + 1))
            time.sleep(1)

        if user_name == "admin" and password == "123456":
            self.textBrowser.setText("欢迎%s" % user_name)
            self.textBrowser.repaint()
        else:
            self.textBrowser.setText("用户名或密码错误....请重试")
            self.textBrowser.repaint()


if __name__ == '__main__':
    app = QApplication(sys.argv)

    w = MyWindow()
    # 展示窗口
    w.ui.show()

    app.exec()

【PyQt】05-多线程_第1张图片
会使得程序卡住。我就不执行这个了,没啥意义。

多线程代码

'''
#Author :susocool
#Creattime:2024/2/4
#FileName:014-多线程
#Description: 理解多线程
'''
import sys
import time

from PyQt5 import uic
from PyQt5.Qt import QApplication, QWidget, QThread


class MyThread(QThread):    # 这里需要注意括号里是QThread,MyThread 类继承自 QThread 类
    def __init__(self):     # 调用初始化
        super().__init__()  # 调用父类的初始化

    def run(self):
        for i in range(10):
            print("是MyThread线程中执行....%d" % (i + 1))
            time.sleep(1)


class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi("./thread-1.ui")

        # 从ui文件中加载控件
        lineedit = self.ui.lineEdit
        btn1 = self.ui.pushButton
        btn2 = self.ui.pushButton_2

        # 给2个按钮绑定槽函数
        btn1.clicked.connect(self.click_1)  # 绑定槽函数
        btn2.clicked.connect(self.click_2)  # 绑定槽函数
	# 按钮1 直接延时到10
    def click_1(self):
        for i in range(10):
            print("是UI线程中执行....%d" % (i + 1))
            time.sleep(1)
	# 按钮2 创建线程
    def click_2(self):
        self.my_thread = MyThread()  # 创建线程
        self.my_thread.start()  # 开始线程


if __name__ == "__main__":
    app = QApplication(sys.argv)
    myshow = MyWin()
    myshow.ui.show()
    app.exec()

一些解释
关于Python中的self,我一直不明白。

在 Python 中,self 是一个特殊的参数,用于表示类的实例对象自身。它是一个约定俗成的命名,大部分情况下都使用 self,但在语法上可以使用任意名称。
当定义一个类的方法时,第一个参数通常被命名为 self(或其他约定俗成的名称,比如 this),用于引用该类的实例对象。通过 self,我们可以在类的方法内部访问实例的属性、调用实例的方法,以及操作实例所拥有的其他成员。
这个 self 参数并不需要在调用方法时手动传递,Python 会自动将方法调用者的实例赋值给 self。

def run(self):
self 是指当前线程实例的引用,QThread 类会自动传递线程实例给 self,并自动调用 run 方法执行我们编写的代码。当线程被启动时,就会自动调用 run 方法中的代码。

运行结果

当点击按钮1
【PyQt】05-多线程_第2张图片
【PyQt】05-多线程_第3张图片
当点击按钮2
【PyQt】05-多线程_第4张图片


总结

  • 介绍了PyQt中的多线程

你可能感兴趣的:(PyQt5,pyqt)