PyQt5实现进度条与定时器及子线程同步关联

作者:Sir 时间:2023-03-20 14:48:35 

进度条是当我们处理冗长的任务时使用的控件,它是以动画的形式让用户知道该任务正在取得进展。

在PyQt5中的进度条对应组件是QProgressBar,该对象继承自QWidget组件。一般在生产业务的实现过程中还需要借助定时器来实现的。

在实际使用的过程当中进度条的进度控制往往还要根据子线程的业务执行过程来设置进度显示。

PyQt5实现进度条与定时器及子线程同步关联

PyQt5在之前的文章中已经多次使用,想必大家都比较熟悉了。若是没有安装的话使用pip的方式安装一下即可。

pip install PyQt5

接下来将本文中使用到的相关模块都导入到代码块中。

# It imports all the classes, methods, and attributes of the `PyQt5.QtWidgets` module.
from PyQt5.QtWidgets import *

# It imports all the classes, methods, and attributes of the `PyQt5.QtCore` module.
from PyQt5.QtCore import *

# It imports all the classes, methods, and attributes of the `PyQt5.QtGui` module.
from PyQt5.QtGui import *

# It imports the `sys` module.
import sys

# It imports the `time` module and it renames it to `t`.
import time as t

接下来我们创建一个ProgressBarUI的python类,将所有的进度条的布局以及槽函数放到该类中。

# This class is a widget that displays a progress bar.
class ProgressBarUI(QWidget):
    def __init__(self):
        super(ProgressBarUI, self).__init__()
        self.init_ui()

    def init_ui(self):
        """
        This function initializes the UI.
        """
        self.setWindowTitle('PyQt5进度条案例 公众号:Python 集中营')
        self.setWindowIcon(QIcon('prop.png'))
        self.resize(500, 200)

        self.progressBar = QProgressBar()
        self.progressBar.setValue(0)
        self.progressBar.setAlignment(Qt.AlignCenter)

        hbox = QHBoxLayout()
        hbox.addWidget(self.progressBar)

        self.timer = QTimer()
        self.timer.timeout.connect(self.listen_step)
        self.timer.start(100)

        self.step = 0

        self.thread_ = WorkThread()
        self.thread_.thread_step.connect(self.step_add)

        self.thread_.start()

        self.setLayout(hbox)

    def step_add(self, n):
        """
        It adds n to the current value of the counter

        :param n: the number of steps to take
        """
        self.step = self.step + n

    def listen_step(self):
        """
        > The function `listen_step` is called by the `listen` function, and it returns the next step in the conversation
        """
        if self.progressBar.value() >= 100:
            self.timer.stop()
        else:
            self.progressBar.setValue(self.step)

创建一个子线程WorkThread继承自QThread用于处理所有的业务实现逻辑。

# This class is a subclass of QThread and it's used to create a thread that will run the function that will be passed to
# it
class WorkThread(QThread):
    # A signal that is emitted when the value of the counter changes.
    thread_step = pyqtSignal(int)

    def __init__(self):
        """
        A constructor. It is called when an object is created from a class and it allows the class to initialize the
        attributes of a class.
        """
        super(WorkThread, self).__init__()
        self.working = True

    def __del__(self):
        """
        A destructor. It is called when the object is destroyed.
        """
        self.working = False

    def run(self):
        for n in range(1, 101):
            self.thread_step.emit(1)
            t.sleep(0.1)

使用python模块的main函数,将整个应用加入到系统的主体循环中。

# A common idiom to use this as the last statement in a module (a file that contains Python code).
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = ProgressBarUI()
    main.show()
    sys.exit(app.exec_())

来源:https://mp.weixin.qq.com/s/rO-cl0HWVtHWtIgOzXq9_A

标签:PyQt5,进度条
0
投稿

猜你喜欢

  • 教你如何使用MySQL8递归的方法

    2024-01-28 22:59:12
  • Python中IPYTHON入门实例

    2021-01-23 04:56:25
  • Python+selenium 获取一组元素属性值的实例

    2021-06-06 02:28:27
  • vue新玩法VueUse工具库具体用法@vueuse/core详解

    2023-07-02 16:55:44
  • python 返回列表中某个值的索引方法

    2021-05-25 21:44:13
  • MySQL数据库中的重要数据应当如何保护

    2008-12-17 15:56:00
  • 让XML在ASP中发挥其长处

    2008-01-16 19:07:00
  • SQL Server导入导出数据方法

    2007-08-17 09:50:00
  • 每个分类取最新的几条的SQL实现代码

    2012-08-21 10:57:18
  • Python3使用TCP编写一个简易的文件下载器功能

    2021-02-20 09:58:07
  • JS+CSS模拟可以无刷新显示内容的留言板实例

    2024-04-19 10:17:13
  • javascript实现playfair和hill密码算法

    2024-04-18 10:46:28
  • python函数参数*args**kwargs用法实例

    2021-03-25 14:19:41
  • 常用原生js自定义函数总结

    2024-04-16 09:05:57
  • 利用SQL注入漏洞登录后台的实现方法

    2024-01-18 10:03:44
  • oracle join on 数据过滤问题

    2009-07-14 21:17:00
  • MYSQL常用命令与实用技巧

    2024-01-22 05:22:25
  • Mysql中正则表达式Regexp常见用法及说明

    2024-01-14 21:51:35
  • 教你轻松掌握MaxDB和MySQL之间的协同性

    2009-02-23 17:28:00
  • JS内部事件机制之单线程原理

    2024-05-03 15:58:24
  • asp之家 网络编程 m.aspxhome.com