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中的集合类型知识讲解
Aug 19 Python
使用Python的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
python多进程提取处理大量文本的关键词方法
Jun 05 Python
python 使用 requests 模块发送http请求 的方法
Dec 09 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
Python新手学习raise用法
Jun 03 Python
浅析Python 多行匹配模式
Jul 24 Python
python如何导出微信公众号文章方法详解
Aug 31 Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 Python
python中的sys模块和os模块
Mar 20 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自定义函数实现代码
2011/12/30 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
PHP PDOStatement::fetchObject讲解
2019/02/01 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
用javascript实现无刷新更新数据的详细步骤 asp
2006/12/26 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
基于python实现复制文件并重命名
2020/09/16 Python
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
安全标兵事迹材料
2014/08/17 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
负责培养人意见
2015/06/05 职场文书
老人院义工活动感想
2015/08/07 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS
Oracle 多表查询基本语法实例
2022/04/18 Oracle