python GUI库图形界面开发之PyQt5线程类QThread详细使用方法

下面是详细的攻略。

Python GUI库图形界面开发之PyQt5线程类QThread详细使用方法

在PyQt5中,线程类QThread被用来处理一些耗时的操作,以避免把这些操作放在主线程中引起其卡顿或者假死。下面我们详细讲解QThread的使用方法。

QThread的使用方法

1.导入必要的模块和类

import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar

2.自定义线程类

需要继承QThread,并添加需要执行的方法,使用pyqtSignal来发射信号。

class MyThread(QThread):
    # 自定义信号,代表运算完毕后传递的参数类型为int
    result = pyqtSignal(int)

    def __init__(self, parent=None):
        super().__init__(parent)

    def run(self):
        # 这里面是需要执行的代码,可以新开一个线程去执行
        for i in range(101):
            self.result.emit(i)
            self.msleep(100) # 线程休眠0.1s

3.创建窗口类

创建一个窗口类,添加需要的控件。

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        # 添加按钮和进度条
        self.btn_start = QPushButton('Start', self)
        self.btn_start.setGeometry(10, 10, 60, 30)
        self.progress_bar = QProgressBar(self)
        self.progress_bar.setGeometry(80, 10, 200, 30)

4.创建槽函数和信号连接

创建槽函数,即当接收到信号时执行的函数。通过如下代码来连接自定义信号和槽函数:

self.thread = MyThread(self)
self.thread.result.connect(self.step)

5.添加槽函数的实现代码

实现槽函数代码,在其中更新进度条。

def step(self, val):
    self.progress_bar.setValue(val)

6.启动线程

点击按钮,启动线程,执行自定义线程类的代码。

def start_thread(self):
    self.thread.start()

到此,使用QThread来实现多线程的基本过程就完成了,下面可以看两个示例:

示例1:线程内部执行自带循环

这里我们在自定义线程类中使用了while循环,开启线程后便会不断运行。每次运行都会发射一个信号,用于更新窗口中的进度条。

import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar

class MyThread(QThread):
    result = pyqtSignal(int)

    def __init__(self, parent=None):
        super().__init__(parent)

    def run(self):
        i = 0
        while True:
            i = i + 1 if i < 100 else 1
            self.result.emit(i)
            self.msleep(100)

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.btn_start = QPushButton('Start', self)
        self.btn_start.setGeometry(10, 10, 60, 30)

        self.progress_bar = QProgressBar(self)
        self.progress_bar.setGeometry(80, 10, 200, 30)

        self.thread = MyThread(self)
        self.thread.result.connect(self.step)
        self.btn_start.clicked.connect(self.start_thread)

    def step(self, val):
        self.progress_bar.setValue(val)

    def start_thread(self):
        self.thread.start()

app = QApplication(sys.argv)
main_win = MainWindow()
main_win.show()
app.exec_()

示例2:线程使用参数

这里我们在线程类中创建一个参数,启动线程时传入,线程运行时使用该参数执行操作,并将操作结果作为信号传递给窗口类中的槽函数更新进度条。

import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar

class MyThread(QThread):
    result = pyqtSignal(int)

    def __init__(self, parent=None):
        super().__init__(parent)
        self._loop_cnt = 0

    def set_cnt(self, cnt):
        self._loop_cnt = cnt

    def run(self):
        for i in range(1, self._loop_cnt+1):
            self.result.emit(i)
            self.msleep(100)

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.btn_start = QPushButton('Start', self)
        self.btn_start.setGeometry(10, 10, 60, 30)

        self.progress_bar = QProgressBar(self)
        self.progress_bar.setGeometry(80, 10, 200, 30)

        self.thread = MyThread(self)
        self.thread.result.connect(self.step)
        self.btn_start.clicked.connect(self.start_thread)

    def step(self, val):
        self.progress_bar.setValue(val)

    def start_thread(self):
        self.thread.set_cnt(100)
        self.thread.start()

app = QApplication(sys.argv)
main_win = MainWindow()
main_win.show()
app.exec_()

这两个示例都是非常实用的,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python GUI库图形界面开发之PyQt5线程类QThread详细使用方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 分享一个常用的Python模拟登陆类

    下面我将会详细讲解如何分享一个常用的Python模拟登陆类,包含以下几个部分。 1. 确定模拟登陆的目标站点 在分享一个常用的Python模拟登陆类之前,我们首先需要明确登陆对象的目标站点。不同的站点,在模拟登陆过程中可能会有不同的实现方式和注意点。 例如,对于一些不需要验证码的网站,登陆过程可能就比较简单,只需要模拟发送一次POST请求,将用户名和密码等信…

    python 2023年6月3日
    00
  • python实现汉诺塔算法

    汉诺塔问题是一个经典的递归问题,它的基本思想是将一个塔从起始位置移动到目标位置,中间可以借助一个辅助位置。在中,我们可以使用递归来实现汉诺塔算法。 以下是汉诺塔算法的Python代码示例: def hanoi(n, start, end, auxiliary): if n ==1: print("Move disk from {} to {}&qu…

    python 2023年5月13日
    00
  • 使用 Python 解析配置文件格式

    使用 Python 解析配置文件格式需要以下步骤: 安装配置文件解析库 Python 自带的 configparser 模块可以解析 .ini 文件格式,可以直接使用。如果需要解析其他格式的配置文件,例如 .yaml、.json 等,需要使用相应的第三方库进行解析,比如 PyYAML 和 json 模块。 定义配置文件 定义配置文件时,需要按照相应的格式来定…

    python 2023年6月3日
    00
  • Python多个MP4合成视频的实现方法

    Python 多个 MP4 合成视频的实现方法 在 Python 中,我们可以使用 moviepy 库进行多个 MP4 合成视频的操作。该库提供的 API 能够让我们轻松地将多个视频合并成一个视频。 安装 moviepy 库 在使用 moviepy 库之前,需要先安装该库。我们可以使用 pip 进行安装,运行以下命令: pip install moviepy…

    python 2023年5月19日
    00
  • python将字符串转换成json的方法小结

    下面我将详细讲解“Python将字符串转换成JSON的方法小结”。 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,它的写法类似于JavaScript对象。Python内置了JSON模块,可以方便地在Python与其他语言之间进行数据交换。 JSON库常用函数 在Python中使用JSON库将字符…

    python 2023年6月3日
    00
  • Python多线程编程(五):死锁的形成

    死锁是一种多线程编程中的常见问题,是指两个或多个线程在执行过程中互相等待对方释放需要的资源,并导致所有线程无法继续执行的情况。下面我将详细讲解如何避免死锁的形成。 什么是死锁? 死锁是指在两个或多个线程协作完成某项任务的过程中,由于彼此之间相互等待对方释放需要的资源,导致所有线程都停止执行的现象。例如,线程 A 在占用资源 1 的同时等待获取资源 2,而线程…

    python 2023年5月18日
    00
  • Python开源自动化工具Playwright安装及介绍使用

    Python开源自动化工具Playwright是一个功能强大、易于使用的自动化测试工具。它允许开发人员使用Python编写端到端测试,并且可以与多种浏览器和操作系统进行交互。 以下是完整的攻略步骤: 1. 安装Playwright 安装Playwright需要使用pip命令: pip install playwright 此外,还需要在本地安装要进行自动化测…

    python 2023年5月19日
    00
  • python 类相关概念理解

    下面是“Python类相关概念理解”的完整攻略: 一、Python类的基本概念 1.1 类的定义 在Python中使用class关键字来定义一个类,如下所示: class MyClass: pass 类名通常采用驼峰命名法。在类定义中使用的pass语句意味着这个类是空的,不包含任何属性和方法。 1.2 类的对象 当类被定义并创建后,我们就可以通过实例化一个对…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部