python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > PyQt5同步关联

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

作者:Sir 老王

这篇文章主要为大家详细介绍了PyQt5如何实现进度条与定时器及子线程的同步关联,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

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

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

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

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_())

到此这篇关于PyQt5实现进度条与定时器及子线程同步关联的文章就介绍到这了,更多相关PyQt5同步关联内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文