pyqt5中QThread在使用时出现重复emit的实例


Posted in Python onJune 21, 2019

在PyQt5中使用QThread的时候,要注意把所有QThread的对象在主类中的init(或者放在所有类函数的外面)中进行实例化,不然可能在多个QThread互相调用的时候,emit重复的信号。一般比较正确的写法如下所示,基本照着这种框架搭建都是没问题的。

# -*- coding: utf-8 -*-
import sys
import time
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
 
 
class MainUi(QWidget):
  def __init__(self):
    super(MainUi, self).__init__()
    self.resize(400, 200)
    self.setWindowTitle('QThread例子')
 
    # 实例化多线程对象
    self.thread = Worker()
 
    # 实例化列表控件与按钮控件
    self.listFile = QListWidget()
    self.btnStart = QPushButton('开始')
    self.btn_over = QPushButton('结束')
 
    # 把控件放置在栅格布局中
    layout = QGridLayout(self)
    layout.addWidget(self.listFile, 0, 0, 1, 2)
    layout.addWidget(self.btnStart, 1, 0)
    layout.addWidget(self.btn_over, 1, 1)
 
    # 信号与槽函数的连接
    self.btnStart.clicked.connect(self.slotStart)
    self.btn_over.clicked.connect(self.slot_btn_over)
 
    # 建立线程信号的槽连接
    self.thread.trigger.connect(self.slotAdd)
 
  def slotAdd(self, msg):
    print(msg)
    if int(msg) % 2 == 0:
      self.listFile.addItem(msg)
    else:
      pass
    self.thread.exit()
 
  def slotStart(self):
    self.btnStart.setEnabled(False)
    self.thread.start()
 
  def slot_btn_over(self):
    self.btnStart.setEnabled(True)
    self.thread.terminate()
    self.thread.num = 0
 
 
class Worker(QThread):
  trigger = pyqtSignal(str)
  num = 0
 
  def __init__(self):
    super(Worker, self).__init__()
 
  def run(self):
    while True:
      print('num= ', self.num)
      if self.num % 2 == 0:
        self.trigger.emit(str(50))
      elif self.num == 200:
        self.num = 0
      else:
        pass
      time.sleep(0.1)
      self.num += 1
 
 
if __name__ == '__main__':
  app = QApplication(sys.argv)
  w = MainUi()
  w.show()
  sys.exit(app.exec_())

以上这篇pyqt5中QThread在使用时出现重复emit的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Linux环境下MySQL-python安装过程分享
Feb 02 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
python可视化篇之流式数据监控的实现
Aug 07 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
python 多线程死锁问题的解决方案
Aug 25 Python
python上下文管理器异常问题解决方法
Feb 07 Python
Python如何配置环境变量详解
May 18 Python
详解运行Python的神器Jupyter Notebook
Jun 03 Python
Python实现GIF动图以及视频卡通化详解
Dec 06 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 #Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 #Python
django框架使用orm实现批量更新数据的方法
Jun 21 #Python
python字典改变value值方法总结
Jun 21 #Python
python如何以表格形式打印输出的方法示例
Jun 21 #Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 #Python
对pyqt5之menu和action的使用详解
Jun 20 #Python
You might like
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
php array_search() 函数使用
2010/04/13 PHP
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
基于php无限分类的深入理解
2013/06/02 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
Python生成不重复随机值的方法
2015/05/11 Python
Python中基础的socket编程实战攻略
2016/06/01 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
详解python的argpare和click模块小结
2019/03/31 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
给同事的道歉信
2014/01/11 职场文书
项目考察欢迎辞
2014/01/17 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
承诺书范本
2015/01/21 职场文书
工作检讨书范文
2015/01/23 职场文书
道歉情书大全
2015/05/12 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
话题作文之诚信
2019/11/28 职场文书
Python中with上下文管理协议的作用及用法
2022/03/18 Python