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实现的系统实用log类实例
Jun 30 Python
Python 通过URL打开图片实例详解
Jun 01 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
基于Python函数的作用域规则和闭包(详解)
Nov 29 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
Django数据库操作之save与update的使用
Apr 01 Python
Python使用configparser读取ini配置文件
May 25 Python
使用keras实现非线性回归(两种加激活函数的方式)
Jul 05 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 Python
python中实现词云图的示例
Dec 19 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/18 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
JS BASE64编码 window.atob(), window.btoa()
2021/03/09 Javascript
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
JS+Ajax实现百度智能搜索框
2017/08/04 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
JS实现拼图游戏
2021/01/29 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
详解Python网络爬虫功能的基本写法
2016/01/28 Python
学习python需要有编程基础吗
2020/06/02 Python
Python 远程开关机的方法
2020/11/18 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
同志主要表现材料
2014/08/21 职场文书
资产运营委托书范本
2014/10/16 职场文书
交通事故案件代理词
2015/05/23 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
golang import自定义包方式
2021/04/29 Golang
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python