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将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
Flask框架配置与调试操作示例
Jul 23 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
Python通过VGG16模型实现图像风格转换操作详解
Jan 16 Python
python对接ihuyi实现短信验证码发送
May 10 Python
keras 如何保存最佳的训练模型
May 25 Python
Python简单实现词云图代码及步骤解析
Jun 04 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
python使用re模块爬取豆瓣Top250电影
Oct 20 Python
python palywright库基本使用
Jan 21 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防攻击代码升级版
2010/12/29 PHP
php 启动报错如何解决
2014/01/17 PHP
在WordPress的文章编辑器中设置默认内容的方法
2015/12/29 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
PHP实现负载均衡session共享redis缓存操作示例
2018/08/22 PHP
php-fpm中max_children的配置
2019/03/15 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
JavaScript prototype属性使用说明
2010/05/13 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
python迭代器实例简析
2014/09/25 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
基于python图书馆管理系统设计实例详解
2020/08/05 Python
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
问卷调查计划书
2014/01/10 职场文书
工会工作先进事迹
2014/08/18 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
4种非常实用的python内置数据结构
2021/04/28 Python
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js