PyQt 线程类 QThread使用详解


Posted in Python onJuly 16, 2017

PyQt中的线程类 QtCore.QThread ,使用时继承QThread类

启动界面的线程暂称为UI线程。界面执行命令时都在自己的UI线程中。

如果在UI线程中执行网络连接和数据库操作等耗时的操作,界面会被卡住,Windows下有可能会出现“无响应”的警告。

阻塞UI线程会降低用户体验和应用稳定性。因此我们可以把耗时操作放在线程中去执行。

QThread代表一个线程,我们可以复写run函数来执行我们要的操作。

QThread可以使用 QtCore.pyqtSignal 来与界面交互和传输数据。

PyQt4 QThread 代码示例

•Python2.7
# -*- coding: utf-8 -*-
import sys

from PyQt4 import QtCore
from PyQt4.QtCore import QCoreApplication
from PyQt4.QtGui import QWidget, QPushButton, QApplication, QTextBrowser


class TimeThread(QtCore.QThread):
  signal_time = QtCore.pyqtSignal(str, int) # 信号

  def __init__(self, parent=None):
    super(TimeThread, self).__init__(parent)
    self.working = True
    self.num = 0

  def start_timer(self):
    self.num = 0
    self.start()

  def run(self):
    while self.working:
      print "Working", self.thread()
      self.signal_time.emit("Running time:", self.num) # 发送信号
      self.num += 1
      self.sleep(1)


class TimeDialog(QWidget):
  def __init__(self):
    super(TimeDialog, self).__init__()
    self.timer_tv = QTextBrowser(self)
    self.init_ui()
    self.timer_t = TimeThread()
    self.timer_t.signal_time.connect(self.update_timer_tv)

  def init_ui(self):
    self.resize(300, 200)
    self.setWindowTitle('TimeDialog')
    self.timer_tv.setText("Wait")
    self.timer_tv.setGeometry(QtCore.QRect(10, 145, 198, 26))
    self.timer_tv.move(0, 15)

    btn1 = QPushButton('Quit', self)
    btn1.setToolTip('Click to quit')
    btn1.resize(btn1.sizeHint())
    btn1.move(200, 150)
    btn1.clicked.connect(QCoreApplication.instance().quit)

    start_btn = QPushButton('Start', self)
    start_btn.setToolTip("Click to start")
    start_btn.move(50, 150)
    self.connect(start_btn, QtCore.SIGNAL("clicked()"), self.click_start_btn)

  def click_start_btn(self):
    self.timer_t.start_timer()

  def update_timer_tv(self, text, number):
    self.timer_tv.setText(self.tr(text + " " + str(number)))


if __name__ == '__main__':
  app = QApplication(sys.argv)
  time_dialog = TimeDialog()
  time_dialog.show()

  sys.exit(app.exec_())

QThread中使用的信号 signal_time = QtCore.pyqtSignal(str, int) 指定了参数str和int

发送信号 self.signal_time.emit("Running time:", self.num)

外部接收信号 self.timer_t.signal_time.connect(self.update_timer_tv)
信号连接到方法 update_timer_tv(self, text, number) ,注意信号与方法的参数要一一对应

使用中我们可以定义多种不同的信号 QtCore.pyqtSignal

启动线程,调用 start()

Python 相关文章推荐
Python中处理时间的几种方法小结
Apr 09 Python
Python检测网站链接是否已存在
Apr 07 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
Jan 15 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
python3中zip()函数使用详解
Jun 29 Python
使用pandas读取文件的实现
Jul 31 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
opencv python图像梯度实例详解
Feb 04 Python
Django Admin 上传文件到七牛云的示例代码
Jun 20 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
Pycharm技巧之代码跳转该如何回退
Jul 16 #Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 #Python
Python利用flask sqlalchemy实现分页效果
Aug 02 #Python
Python实现发送QQ邮件的封装
Jul 14 #Python
python记录程序运行时间的三种方法
Jul 14 #Python
python运行其他程序的实现方法
Jul 14 #Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 #Python
You might like
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
npm qs模块使用详解
2020/02/07 Javascript
Python运行的17个时新手常见错误小结
2012/08/07 Python
python访问系统环境变量的方法
2015/04/29 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
vscode 远程调试python的方法
2017/12/01 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
python安装gdal的两种方法
2019/10/29 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
Css3新特性应用之视觉效果实例
2016/12/12 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
社会实践的活动方案
2014/08/22 职场文书
放飞理想主题班会
2015/08/14 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL