【转】解决Pyqt5界面假死现象(以QProgressBar为例)

简介: 【转】解决Pyqt5界面假死现象(以QProgressBar为例)

highlight: a11y-dark

theme: qklhk-chocolate

记录,笔记

Pyqt5界面假死现象(以QProgressBar为例)

用PyQt5在进行GUI的编写时,如果界面运行线程和槽函数运行线程在同一线程,当槽函数处理时间较长时,在这个处理过程的时间段,界面就会卡死,也就是“界面假死”,不能进行其他操作。

因此,如果槽函数的处理时间过长,最好新建立线程,独立运行槽函数,发出信号,再控制界面的变化。
以下就以QProgressBar为例说明。

from PyQt5.QtWidgets import QApplication, QProgressBar, QPushButton
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
import time

class ProgressBar(QtWidgets.QWidget):
    def __init__(self, parent= None):
        QtWidgets.QWidget.__init__(self)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('ProgressBar')
        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)
        self.pbar.setRange(0, 100)
        self.pbar.setValue(0)

        self.button = QPushButton('Start', self)
        self.button.setFocusPolicy(Qt.NoFocus)
        self.button.move(40, 80)
        self.button.clicked.connect(self.pbar_change)
    def pbar_change(self):
        for i in range(100):
            time.sleep(0.5)#设置时间延迟,以表示运行时间长短
            self.pbar.setValue(i+1)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    qb = ProgressBar()
    qb.show()
    sys.exit(app.exec_())

在上述代码中,time.sleep(0.5)#设置时间延迟,以表示运行时间长短,当值设为0时,运行代码,主界面的进度条变化很快,但当值较大时,界面卡死。

设置线程,解决界面卡死
更改代码如下:

第一步:导入相关的库

from threading import  Thread
from PyQt5.QtCore import pyqtSignal,QObject

第二步:建立信号库,连接新线程和主线程

# 信号库
class SignalStore(QObject):
    # 定义一种信号
    progress_update = pyqtSignal(int)
    # 还可以定义其他作用的信号
# 实例化
so = SignalStore()

第三步:设置新线程

重新写进度条值的变化代码,在新线程中运行。

 def handleCalc(self):
        def pbar_change():
            for i in range(100):
                time.sleep(5)
                so.progress_update.emit(i+1)
        worker = Thread(target=pbar_change)
        worker.start()
`

以上代码中,so.progress_update.emit(i+1)为新线程中发出的信号,也就是进度条的值。worker = Thread(target=pbar_change)建立线程;worker.start()启动线程。

第四步:接收信号。

def setProgress(self,value):
        self.pbar.setValue(value)

完整代码如下,对比运行,自行理解。

from PyQt5.QtWidgets import QApplication, QProgressBar, QPushButton
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
import time
from threading import  Thread
from PyQt5.QtCore import pyqtSignal,QObject

# 信号库
class SignalStore(QObject):
    # 定义一种信号
    progress_update = pyqtSignal(int)
    # 还可以定义其他作用的信号

# 实例化
so = SignalStore()

class ProgressBar(QtWidgets.QWidget):
    def __init__(self, parent= None):
        QtWidgets.QWidget.__init__(self)

        so.progress_update.connect(self.setProgress)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('ProgressBar')
        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)
        self.pbar.setRange(0, 100)
        self.pbar.setValue(0)

        self.button = QPushButton('Start', self)
        self.button.setFocusPolicy(Qt.NoFocus)
        self.button.move(40, 80)
        self.button.clicked.connect(self.handleCalc)

    def handleCalc(self):
        def pbar_change():
            for i in range(100):
                time.sleep(5)
                so.progress_update.emit(i+1)
        worker = Thread(target=pbar_change)
        worker.start()
    # 处理进度的slot函数
    def setProgress(self,value):
        self.pbar.setValue(value)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    qb = ProgressBar()
    qb.show()
    sys.exit(app.exec_())
相关文章
|
数据库 UED Python
1、基于python多进程+pyqt5开发流畅界面程序
使用python+pyqt5开发界面程序,利用多进程分离界面和任务执行功能,达到界面流畅不卡顿的要求。 本文程序示例:https://github.com/AlvinsFish/UiExample
2683 0
1、基于python多进程+pyqt5开发流畅界面程序
Pyside6-第四篇-QCheckBox复选框
Pyside6-第四篇-QCheckBox复选框
1321 0
Pyside6-第四篇-QCheckBox复选框
|
机器学习/深度学习 测试技术 Python
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
1432 0
【激活函数】基础回顾:带你认识神经网络中常见的激活函数
|
人工智能 架构师 算法
阿里P6到P9的技术栈有哪些?程序员该如何准备学习?如何进入大厂
相信每一个程序员应该都有一个大厂梦,但是不知道如何进入大厂,或者说是技术栈和项目经验达不到大厂的要求! 那就有人问了,那怎么样才能进入大厂呢?进入大厂的话都有哪些要求呢? 小编,就给大家简单介绍一下,要想进入大厂需要达到的要求! 总结起来一共有四点:1.学历;2.技术栈+项目经验;3.心理素质+思维转变;4.面试技巧;
|
域名解析 应用服务中间件 nginx
Nginx反向代理实现docker容器域名解析
Nginx反向代理实现docker容器域名解析
2355 0
|
XML JSON Ubuntu
Python实用记录(十五):PyQt/PySide6打包成exe,精简版(nuitka/pyinstaller/auto-py-to-exe)
本文介绍了使用Nuitka、PyInstaller和auto-py-to-exe三种工具将Python的PyQt/PySide6应用打包成exe文件的方法。提供了详细的安装步骤、打包命令和参数说明,适合新手学习和实践。
4444 0
|
JSON API 数据库
Python使用Quart作为web服务器的代码实现
Quart 是一个异步的 Web 框架,它使用 ASGI 接口(Asynchronous Server Gateway Interface)而不是传统的 WSGI(Web Server Gateway Interface)。这使得 Quart 特别适合用于构建需要处理大量并发连接的高性能 Web 应用程序。与 Flask 类似,Quart 也非常灵活,可以轻松地构建 RESTful API、WebSockets、HTTP/2 服务器推送等。
|
Python
【Python】已解决:(Python写入Excel表格报错)‘NoneType’ object has no attribute ‘write’
【Python】已解决:(Python写入Excel表格报错)‘NoneType’ object has no attribute ‘write’
961 0
|
前端开发 容器
Bootstrap 5 保姆级教程(一):容器 & 网格系统
Bootstrap 5 保姆级教程(一):容器 & 网格系统
|
机器学习/深度学习 数据处理
【YOLOV5-6.x讲解】数据增强方式介绍+代码实现
数据增强 学习到空间的不变形,像素级别的不变形特征都有限,利用平移,缩放,旋转,改变色调值等方法,让模型见过各种类型的数据,提高模型在测试数据上的判别力
2621 1