开发者

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

开发者 https://www.devze.com 2023-01-13 09:22 出处:网络 作者: Sir 老王
进度条是当我们处理冗长的任务时使用的控件,它是以动画的形式让用户知道该任务正在取得进展。

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

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

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

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

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

pipinstallPyQt5

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

#Itimportsalltheclasses,methods,andattributesofthe`PyQt5.QtWidgets`module.
fromPyQt5.QtWidgetsimport*

#Itimportsalltheclasses,methods,andattributesoftwww.devze.comhe`PyQt5.QtCore`module.
fromPyQt5.QtCoreimport*

#Itimpojavascriptrtsalltheclasses,methods,andattributesofthe`PyQt5.QtGui`module.
fromPyQt5.QtGuiimport*

#Itimportsthe`sys`module.
importsys

#Itimportsthe`time`moduleanditrenamesitto`t`.
importtimeast

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

#Thisclassisawidgetthatdisplaysaprogressbar.
classProgressBarUI(QWidget):
def__init__(self):
super(ProgressBarUI,self).__init__()
self.init_ui()

definit_ui(self):
"""
ThisfunctioninitializestheUI.
"http://www.devze.com""
self.setWindowTitle('PyQt5进度条案例公众号:Python 集中营')
self.setWindowIcon(QIcon('prop.png'))
self.resize(500,200)

self.propythongressBar=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)

defstep_add(self,n):
"""
Itaddsntothecurrentvalueofthecounter

:paramn:thenumberofstepstotake
"""
self.step=self.step+n

deflisten_step(self):
"""
>Thefunction`listen_step`iscalledbythe`li开发者_JAVA教程sten`function,anditreturnsthenextstepintheconversation
"""
ifself.progressBar.value()>=100:
self.timer.stop()
else:
self.progressBar.setValue(self.step)

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

#ThisclassisasubclassofQThreadandit'susedtocreateathreadthatwillrunthefunctionthatwillbepassedto
#it
classWorkThread(QThread):
#Asignalthatisemittedwhenthevalueofthecounterchanges.
thread_step=pyqtSignal(int)

def__init__(self):
"""
Aconstructor.ItiscalledwhenanobjectiscreatedfroMAClassanditallowstheclasstoinitializethe
attributesofaclass.
"""
super(WorkThread,self).__init__()
self.working=True

def__del__(self):
"""
Adestructor.Itiscalledwhentheobjectisdestroyed.
"""
self.working=False

defrun(self):
forninrange(1,101):
self.thread_step.emit(1)
t.sleep(0.1)

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

#Acommonidiomtousethisasthelaststatementinamodule(afilethatcontain编程sPythoncode).
if__name__=='__main__':
app=QApplication(sys.argv)
main=ProgressBarUI()
main.show()
sys.exit(app.exec_())

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

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号