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 相关文章推荐
python正则表达式re模块详解
Jun 25 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
python保存数据到本地文件的方法
Jun 23 Python
浅析python继承与多重继承
Sep 13 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
python正则表达式匹配IP代码实例
Dec 28 Python
Python list运算操作代码实例解析
Jan 20 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
django中ImageField的使用详解
Dec 21 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 Python
Python编程源码报错解决方法总结经验分享
Oct 05 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 smarty模版引擎中的缓存应用
2009/12/11 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
2013/06/06 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
Bootstrap插件全集
2016/07/18 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
详解python如何引用包package
2020/06/07 Python
Python random模块的使用示例
2020/10/10 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
Shell如何接收变量输入
2016/08/06 面试题
生产总经理岗位职责
2013/12/19 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
寻找成龙观后感
2015/06/12 职场文书
学习心得体会
2019/06/20 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang