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列表转为字典的两个小方法(小结) 在Python中,列表和字典是两种常见的数据类型。有时候我们需要将列表转换为字典,以更方便地进行数据处理。本攻略将介绍种将列表转换为字典的方法。 一:使用zip()函数 在Python中可以使用zip()函数将两个列表合并成一个字典。其中,第一个列表中的元素作字典的键,第二个列表的元素作为字典的值。以下是一些示例…

    python 2023年5月13日
    00
  • Django RestFramework 全局异常处理详解

    Django RestFramework 全局异常处理详解 在Django RestFramework中,全局异常处理是一种非常重要的概念。全局异常处理可以帮助我们捕获处理应用程序的异常,从而提高应用程序稳定性和可靠性。本文将介绍Django RestFramework中的全局异常处理,包括处理的定义、异常处理器的注册、异常器的使用等方面的内容。 异常处理器…

    python 2023年5月13日
    00
  • python实现自动登录后台管理系统

    下面我将详细讲解如何使用Python实现自动登录后台管理系统的完整攻略。 一、准备工作 在开始实现自动登录后台管理系统之前,我们需要先准备好以下工具和资源: Python3.x环境 requests库和BeautifulSoup库 测试用的后台管理系统账号密码 二、实现过程 导入所需库: import requests from bs4 import Bea…

    python 2023年5月19日
    00
  • Python 列表理解及使用方法

    Python列表理解及使用方法 在Python中,列表是一种非常常用的数据类型,用于存储一组有序的元素。列表可以包含不同类型的元素,包括数字、字符串、布尔值等。本文将详细介绍Python列表的理解及使用方法,包括列表的创建、列表的操作、列表的方法等。 列表的创建 要创建一个列表,我们可以使用方括号[]或list()函数。例如: # 创建列表 my_list …

    python 2023年5月13日
    00
  • Python argparse命令参数与config配置参数示例深入详解

    Python的argparse库是用于解析命令行参数的标准库,同时配合configparser模块使用可以实现命令行参数与配置文件参数共存。 命令行参数 使用argparse库解析命令行参数,主要包括以下步骤: 定义脚本的参数列表; 实例化ArgumentParser对象; 添加参数的名称、选项、值等信息; 调用parse_args()方法解析参数列表。 下…

    python 2023年6月3日
    00
  • 五个有趣的Python整蛊小程序合集

    下面是对“五个有趣的Python整蛊小程序合集”完整攻略的详细讲解: 一、项目简介 本项目是一个有趣的Python整蛊小程序合集,包含了五个小程序。这些小程序通过代码的方式制造一些有趣的效果,例如变换鼠标指针样式、模拟键盘输入等。这些可以用于整蛊朋友或者在自己的电脑上玩一些小九九。 以下是五个小程序的简介:1. 短网址-恶搞器:将输入的网址转换为一个极短的伪…

    python 2023年5月23日
    00
  • python安装教程 Pycharm安装详细教程

    Python安装教程 1. 下载Python安装包 在Python官网上下载最新版本的Python安装包,官网地址为:https://www.python.org/downloads/ 根据自己操作系统的不同,选择相应的安装包进行下载。例如,Windows系统需要下载Windows版本的Python安装包。 2. 安装Python 双击下载好的Python安…

    python 2023年5月14日
    00
  • python列表,字典,元组简单用法示例

    Python列表、字典、元组简单用法示例 列表 定义 列表(List)是Python中最基本的数据结构之一,它是一个有序的、可变的元素集合,每个元素都可以通过一个索引来访问。 列表的定义方式,用一对方括号[]将元素括起来,多个元素之间用逗号分隔。例如: names = [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’] 常用操作 访问元…

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