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 相关文章推荐
通过数据库向Django模型添加字段的示例
Jul 21 Python
Django migrations 默认目录修改的方法教程
Sep 28 Python
Python中new方法的详解
Jan 15 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
Numpy之reshape()使用详解
Dec 26 Python
pytorch-神经网络拟合曲线实例
Jan 15 Python
python中如何写类
Jun 29 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
Jan 05 Python
Django权限控制的使用
Jan 07 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 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 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
javascript数组的使用
2013/03/28 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
python编程羊车门问题代码示例
2017/10/25 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
浅析python的Lambda表达式
2019/02/27 Python
python issubclass 和 isinstance函数
2019/07/25 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
Python用户自定义异常的实现
2020/12/25 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
天游软件面试
2013/11/23 面试题
焊接专业毕业生求职信
2013/10/01 职场文书
财政局长自荐信范文
2013/12/22 职场文书
厂长助理岗位职责
2013/12/27 职场文书
公司办公室岗位职责
2014/03/19 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA
win7配置本地ftp服务器的图文教程
2022/08/05 Servers