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 相关文章推荐
利用soaplib搭建webservice详细步骤和实例代码
Nov 20 Python
详解Python中的strftime()方法的使用
May 22 Python
python 二分查找和快速排序实例详解
Oct 13 Python
PyQt5每天必学之布局管理
Apr 19 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
Python对象属性自动更新操作示例
Jun 15 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
Python tkinter label 更新方法
Oct 11 Python
使用python绘制3维正态分布图的方法
Dec 29 Python
python ctypes库2_指定参数类型和返回类型详解
Nov 19 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 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设计模式之简单工厂模式详解
2014/09/04 PHP
PHP实现递归无限级分类
2015/10/22 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
javascript发送短信验证码实现代码
2015/11/12 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
Python之reload流程实例代码解析
2018/01/29 Python
python如何获取apk的packagename和activity
2020/01/10 Python
python中如何设置代码自动提示
2020/07/15 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
python中time、datetime模块的使用
2020/12/14 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
简单介绍Object类的功能、常用方法
2013/10/02 面试题
英语专业毕业生自荐信范文
2013/12/31 职场文书
消防安全管理制度
2014/02/01 职场文书
事务机电主管工作职责
2014/02/25 职场文书
检举信的格式及范文
2014/04/04 职场文书
超市开店计划书
2014/04/26 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
Python如何将list中的string转换为int
2022/07/15 Ruby