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

yizhihongxing

下面是详细的攻略。

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+Appium实现自动化测试的使用步骤

    下面是使用Python+Appium实现自动化测试的完整攻略及示例说明: 简介 Appium是一个用于自动化移动应用程序(包括原生应用程序、混合应用程序和免安装应用程序)的开放源代码测试工具。Python是一种通用的、高级的、解释性的编程语言,可以用于各种各样的应用程序开发和系统管理任务。Appium与Python的结合可以提供强大的自动化测试方案。 使用步…

    python 2023年5月30日
    00
  • python的函数形参和返回值你了解吗

    Python的函数是一种可重用的代码块,用于执行特定的任务,例如计算或打印输出。 函数包含输入参数(即形参)和输出(即返回值)。形参是函数定义中声明的参数,用于在调用函数时传递给函数的值。返回值是函数中执行的结果或计算,用于在调用函数后返回给调用方。 形参的使用可以让函数更加灵活和通用,而函数返回值则可以将计算结果或执行的工作返回给调用方,使得调用方可以对结…

    python 2023年5月14日
    00
  • python 实现二维数组的索引、删除、拼接操作

    在Python中,二维数组可以使用列表嵌套列表的方式来实现。本文将详细讲解如何使用Python实现二维数组的索引、删除、拼接操作。 二维数组的创建 在Python中,可以使用列表嵌套列表的方式来创建二维数组。例如: # 创建一个3行4列的二维数组 arr = [[0 for j in range(4)] for i in range(3)] print(ar…

    python 2023年5月13日
    00
  • 解决python中导入win32com.client出错的问题

    在Python编程过程中,我们可能需要使用win32com.client模块来操作Windows应用程序。然而,在导入win32com.client模块时,我们可能会到各种错误。以下是解决Python中导入win32com.client出错的问题的完整攻略: 1. 安装pywin32 使用win32com.client模块之前,我们需要安装pywin32模块…

    python 2023年5月13日
    00
  • Python CSV文件模块的使用案例分析

    Python CSV文件模块的使用案例分析 什么是CSV文件? CSV文件是一种常见且简单的文件格式,全称为“Comma-Separated Values”(逗号分隔值),也可以称为字符分隔值。它的每一行均表示为一条记录,每个字段中的值都用逗号隔开。由于CSV文件格式简单,通用性较好,在数据交换方面有着广泛的应用。 Python CSV文件的操作 Pytho…

    python 2023年6月3日
    00
  • 如何基于线程池提升request模块效率

    使用线程池可以提升request模块的效率,因为线程池可以重复利用线程,避免了线程创建和销毁的开销,同时也可以避免线程数量过多导致的资源浪费和系统负载过高的问题。下面是基于线程池提升request模块效率的完整攻略,包含两个示例。 1. 使用ThreadPoolExecutor实现线程池 Python标准库中提供了concurrent.futures模块,其…

    python 2023年5月15日
    00
  • Python 高阶函数的装饰器

    下面我会详细讲解Python高阶函数的装饰器使用方法的完整攻略。 什么是装饰器 装饰器是一种可以在不修改原函数的情况下,给函数增加新的功能且可以动态修改功能的函数。在Python中,装饰器是一种语法糖,它通过@符号将一个函数名放在一个特定的函数上面来实现。 Python高阶函数的装饰器使用方法 使用装饰器的过程包括两个步骤:定义装饰器函数和使用装饰器函数。 …

    python-answer 2023年3月25日
    00
  • Python获取CPU、内存使用率以及网络使用状态代码

    获取CPU、内存使用率以及网络使用状态是一项非常有用的任务,可以帮助我们对系统的运行状态有更好的了解。下面是Python获取CPU、内存使用率以及网络使用状态的完整攻略: 1. 获取CPU使用率 Python可以通过psutil库来获取CPU使用率。首先需要使用pip安装psutil库: pip install psutil 接下来,可以使用如下代码来获取C…

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