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中的RSS处理
Apr 13 Python
python使用pil生成图片验证码的方法
May 08 Python
用Python计算三角函数之acos()方法的使用
May 15 Python
python多线程方式执行多个bat代码
Jun 07 Python
深入了解Python数据类型之列表
Jun 24 Python
一步步教你用Python实现2048小游戏
Jan 19 Python
详解Python:面向对象编程
Apr 10 Python
pybind11在Windows下的使用教程
Jul 04 Python
python实现beta分布概率密度函数的方法
Jul 08 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
python数据爬下来保存的位置
Feb 17 Python
matlab xlabel位置的设置方式
May 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
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
js 自定义个性下拉选择框示例
2013/08/20 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
Python实现全角半角字符互转的方法
2016/11/28 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
Django实现基于类的分页功能
2019/10/31 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
django列表筛选功能的实现代码
2020/03/27 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
实习生单位鉴定意见
2013/12/04 职场文书
运动会邀请函范文
2014/02/06 职场文书
贺卡寄语大全
2014/04/11 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
初中作文评语
2014/12/25 职场文书
户外拓展训练感想
2015/08/07 职场文书
小学四年级作文之写景
2019/08/23 职场文书
maven依赖的version声明控制方式
2022/01/18 Java/Android
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技