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中函数的可变参数
Sep 02 Python
python实现俄罗斯方块
Jun 26 Python
使用python3构建文件传输的方法
Feb 13 Python
python调用matlab的m自定义函数方法
Feb 18 Python
详解js文件通过python访问数据库方法
Mar 03 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
Python测试模块doctest使用解析
Aug 10 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
python pyg2plot的原理知识点总结
Feb 28 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
利用PHP创建动态图像
2006/10/09 PHP
PHP 写文本日志实现代码
2010/05/18 PHP
PHP操作数组相关函数
2011/02/03 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
JS的反射问题
2010/04/07 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
RequireJS使用注意细节
2016/05/15 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
COSETTE官网:奢华,每天
2020/03/22 全球购物
毕业生自我鉴定实例
2014/01/21 职场文书
日语专业求职信
2014/07/04 职场文书
党校学习个人总结
2015/02/15 职场文书
Nginx反向代理学习实例教程
2021/10/24 Servers
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python
基于Python实现nc批量转tif格式
2022/08/14 Python