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使用正则表达式提取网页URL的方法
May 26 Python
Python语言描述最大连续子序列和
Dec 05 Python
谈谈python中GUI的选择
Mar 01 Python
tensorflow实现简单的卷积神经网络
May 24 Python
python opencv3实现人脸识别(windows)
May 25 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
Python3.8中使用f-strings调试
May 22 Python
Python中那些 Pythonic的写法详解
Jul 02 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
python实现两个一维列表合并成一个二维列表
Dec 02 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
Python txt文件常用读写操作代码实例
Aug 03 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
北京奥运官方网站幻灯切换效果flash版打包下载
2008/01/30 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
JQuery打造省市下拉框联动效果
2014/05/18 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
jQuery实现提示密码强度的代码
2015/07/15 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
canvas时钟效果
2017/02/16 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
jquery实现上传文件进度条
2020/03/26 jQuery
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python面向对象编程基础解析(一)
2017/10/26 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
Python 爬虫的原理
2020/07/30 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
促销活动策划方案
2014/01/12 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
父母对孩子的寄语
2014/04/09 职场文书
会计求职自荐信范文
2015/03/04 职场文书
海底两万里读书笔记
2015/06/26 职场文书
护士旷工检讨书
2015/08/15 职场文书