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中selenium实现文件上传所有方法整理总结
Apr 01 Python
python实时分析日志的一个小脚本分享
May 07 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
详解Python if-elif-else知识点
Jun 11 Python
Python通用循环的构造方法实例分析
Dec 19 Python
基于python判断目录或者文件代码实例
Nov 29 Python
Python处理PDF与CDF实例
Feb 26 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
python中pop()函数的语法与实例
Dec 01 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/12/06 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
使用php清除bom示例
2014/03/03 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
js使用generator函数同步执行ajax任务
2017/09/05 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
[48:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第二场 1月29日
2021/03/11 DOTA
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
如何理解python面向对象编程
2020/06/01 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
红领巾广播站广播稿
2014/02/01 职场文书
初中校园广播稿
2014/02/02 职场文书
简历中个人自我评价分享
2014/03/15 职场文书
房产公证书格式
2015/01/26 职场文书
考研导师推荐信范文
2015/03/27 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Python 阶乘详解
2021/10/05 Python
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL
MySQL事务的隔离级别详情
2022/07/15 MySQL
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android