Python GUI教程(十一):使用多线程保持GUI的响应

本篇概要

  • 保持GUI程序响应
  • sleep()冻结整个GUI程序
  • 开始、停止和重置我们的导航条
  • 使用多线程和pyqt信号

改善按钮对进度栏的控制

上一篇中我们创建了一个稍显复杂的GUI,并且编写了一些逻辑方法来控制一些按钮和部件的行为。其中,我们设置了三个按钮,用来控制进度条,但是功能还不是很完善。

我们现在将其改进一下:

  • 第一个按钮用来启动进度栏;
  • 第二个按钮用来停止进度栏;
  • 第三个按钮用来重置进度栏;

在之前的MainWindow类中,我们对进度条和按钮的事件设置三个方法:

我们将上述三个方法修改一下,改写成四个方法:

  • start_progressbar(self):用于启动进度栏
  • stop_progressbar(self):用于停止进度栏
  • reset_progressbar(self):用于重置进度栏
  • update_progressbar(self):用于绑定三个按钮到上述三个方法上

运行程序,看看效果:

当我们点击“开始”按钮,进度栏便开始增加,当我们点击“停止按钮”,进度栏便停止增加,当我们点击“重置”按钮,进度栏便归零。

控制进度栏增长速度

在启动进度栏的start_progressbar()方法中,我们通过while循环来增加进度栏,每次增加0.0001,在这样的情况下,进度栏增长得很快。其实,我们可以通过time模块的sleep()方法冻结进度栏,以达到降低进度栏增长速度的效果。

修改start_progressbar()方法如下:

我们让进度栏的数值增长停歇0.3秒,看看效果:

进度栏的增长速度确实比之前缓慢了很多。

使用QThread线程

PyQt中QtCore的QThread对象提供了一个独立于平台的方式来管理线程。

QThread对象通过调用run()方法来执行线程,默认情况下,run()方法通过调用exec()方法来启动事件的循环。

下面,我们通过一个进度栏计数器的示例,来演示一下QThread的使用。

我们新建一个继承自QtCore.QThread的类RunThread(),并在其中定义一个run()方法用来启动线程,定义一个stop()方法用来停止线程。

首先,我们通过实例化QtCore.pyqtSignal(int)定义了一个新的信号counter_value,这个值会用来更新进度栏。然后设置了RunThread()类中的一些默认属性。

在run()方法中,我们通过一个while循环来不断累加计数器的值,并且将累加的计数器的值通过定义的信号counter_value发送出去。

在stop()方法中,我们设置线程的运行状态为Fasle,然后使用QThread的terminate()方法确保线程完全的被停止。

然后,要应用这个进度栏计数器,我们还需要在主窗口类MainWindow()中添加和修改一番:

添加一个进度栏计数器方法progressbar_counter(),用来启动线程管理器:

添加一个进度栏设置方法set_progressbar(),用来设置进度栏的值:

修改一下进度栏的启动方法start_progressbar()。删除while循环,添加进度栏计数器到其中(因为进度栏计数器中已经实现了while循环增加数值):

修改进度栏的停止方法stop_progressbar(),添加线程的stop()方法用来停止线程:

修改完成后,我们运行程序,看看效果:

通过终端打印出来的信息,我们可以直观的看到QThread线程的管理控制。

本篇到此结束。

如果文中有错误欢迎指正。

如果有疑问欢迎留言讨论。 感谢阅读!

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2017-11-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和PYTHON有个约会

Django来敲门~第一部分【6.2 HTML视图模板】

天下难事必作於易。天下大事必作於细。是以圣人终不为大,故能成其大 ——老子《道德经》

1492
来自专栏编程

手把手教 Vue-环境搭建

1 教程简介 1、阅读对象 本篇教程适合新手阅读,老手直接略过 2、教程难度 初级,本人水平有限,文章内容难免会出现问题,如果有问题欢迎指出,谢谢 3、Demo...

3735
来自专栏前端说吧

Compass(更新中。。。)

2476
来自专栏前端学习心得

JavaScript线程机制与事件机制

进程是指程序的一次执行,它占有一片独有的内存空间,可以通过windows任务管理器查看进程(如下图)。同一个时间里,同一个计算机系统中允许两个或两个以上的进程处...

642
来自专栏世界第一语言是java

手动下载genymotion ova镜像文件,genymotion下载失败、慢解决方案

2528
来自专栏大数据钻研

HTML meta标签总结与属性使用介绍

之前学习前端中,对meta标签的了解仅仅只是这一句。 <metacharset="UTF-8"> 但是打开任意的网站,其head标签内都有一列的meta标签。比...

3126
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

Windows平台搭建React Native开发环境

尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://www.devio.org) 告诉大家一个好消息,为大家精心准备的React N...

2914
来自专栏容器云生态

screen 简单使用

      系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通...

2436
来自专栏FreeBuf

挖洞经验 | 记一次曲折的Getshell过程

最近在挖某框架的漏洞,其中挖到一枚Getshell,挖的过程有点曲折感觉可以写篇文章总结一下,方便与各位大牛交流交流。 因为此框架有大量用户,并且此漏洞并未修复...

3439
来自专栏零基础使用Django2.0.1打造在线教育网站

利用Flask搭建微电影视频网站(三):前端首页搭建

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

5421

扫码关注云+社区