pyqt5 tablewidget 利用线程动态刷新数据的方法


Posted in Python onJune 17, 2019

问题

知道要用线程,所以就先尝试写了一个线程,然后每次都获取数据,然后直接通过这种方法来朝table里面更新数据。

#python代码
table=MainWindow_ui.tableWidget_2
table.setItem(i,0,QtWidgets.QTableWidgetItem(str(jcb.Name)))

发现数据并不是想象中跟线程运行那样实时的,要点一下才能显示出数据来

并且还会出现一些问题

问题图片

为了做出对比,我将作业名的表格填写改成table.setItem的方式,其他格子用信号量机制,可以很清楚的看到问题所在!!!!

pyqt5 tablewidget 利用线程动态刷新数据的方法

解决方法

核心是要通过qt的槽函数来发射信号告知qt窗口的组件来进行更新,如果是直接程序上来“发射接受”信号,而不通过qt的槽函数来弄就会出现问题

thread函数

原本class里面自己写的是一个python的threading包的线程,利用threading.Event()来进行进程阻塞,没想到直接修改成 QtCore.QThread,两个混合在一起也能用。。。

class Job(QtCore.QThread):#注意这里使用的是qt自己本身的线程,而不能用python自己的线程
  signal2=QtCore.pyqtSignal(tuple)#因为这个信号槽要继承于Qobject,不然会发生没有emit,connect函数的报错,括号里面填写的是发射的数据类型
  def signal2emit(self,var:tuple):
    self.signal2.emit(var)#朝connect的函数发射一个tuple

  def __init__(self, *args, **kwargs):#这里自己实现
    super(Job, self).__init__(*args, **kwargs)
    self.__flag = threading.Event()   # 用于暂停线程的标识
    self.__flag.set()    # 设置为True
    self.__running = threading.Event()   # 用于停止线程的标识
    self.__running.set()   # 将running设置为True
    self.signal2.connect(setItem)#连接发射函数

  def run(self):
    global SystemTime,TimePice#声明要用的全局变量
    while self.__running.isSet():#如果被设置为了true就继续,false就终止了
      self.__flag.wait()   # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
      ###################
      #这里写线程要干的事情#
      ###################
      time.sleep(1)

  def pause(self):
    self.__flag.clear()   # 设置为False, 让线程阻塞

  def resume(self):
    self.__flag.set()  # 设置为True, 让线程停止阻塞

  def stop(self):
    self.__flag.set()    # 将线程从暂停状态恢复, 如何已经暂停的话
    self.__running.clear()    # 设置为False

setItem函数,接受信号量

def setItem(var:tuple):#用于向jcb表格填写内容
  i=var[0]#行
  j=var[1]#列
  s=var[2]#值
  table=MainWindow_ui.tableWidget_2
  if j != 6 :
    table.setItem(i,j,QtWidgets.QTableWidgetItem(str(s)))
  else :
    table.cellWidget(i,6).setValue(s)#这是个进度条来的

朝表格中填写数据的函数

这是放在主线程中该干的事情的一部分

其中注释掉的部分就是之前直接朝表格中set数据的部分,这是不行的,要通过Qthread来发射信号量

def Print_Job():
  rowcol=len(Jcb_Ready_List)+len(Jcb_Wait_List)
  print(rowcol)
  #MainWindow_ui.tableWidget_2.setRowCount(rowcol)
  for i in range(0,rowcol):
    MainWindow_ui.tableWidget_2.showRow(i)
  #for i in range(rowcol,100):
  #  MainWindow_ui.tableWidget_2.hideRow(i)
  for i in range(0,len(Jcb_Ready_List)):
    jcb=Jcb_Ready_List[i]
    table=MainWindow_ui.tableWidget_2
                     #table.setItem(i,0,QtWidgets.QTableWidgetItem(str(jcb.Name)))
    MainThread.signal2emit((i,0,jcb.Name))
    #table.setItem(i,1,QtWidgets.QTableWidgetItem(str(jcb.Arrival_time)))
    MainThread.signal2emit((i,1,jcb.Arrival_time))
    #table.setItem(i,2,QtWidgets.QTableWidgetItem(str(jcb.Need_memory)))
    MainThread.signal2emit((i,2,jcb.Need_memory))
    #table.setItem(i,3,QtWidgets.QTableWidgetItem(str(jcb.Need_time)))
    MainThread.signal2emit((i,3,jcb.Need_time))
    #table.setItem(i,4,QtWidgets.QTableWidgetItem(str(jcb.Already_execution_time)))
    MainThread.signal2emit((i,4,jcb.Already_execution_time))
    #table.setItem(i,5,QtWidgets.QTableWidgetItem(str(jcb.Wait_time)))
    MainThread.signal2emit((i,5,jcb.Wait_time))
    #bar:QtWidgets.QProgressBar=MainWindow_ui.tableWidget_2.cellWidget(i,6)
    #bar.setValue(100-jcb.Need_time/(jcb.Already_execution_time+jcb.Need_time)*100)
    MainThread.signal2emit((i,6,100-jcb.Need_time/(jcb.Already_execution_time+jcb.Need_time)*100))

成果

这样就顺利实现了table widget的动态更新数据

pyqt5 tablewidget 利用线程动态刷新数据的方法

以上这篇pyqt5 tablewidget 利用线程动态刷新数据的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的reduce内建函数使用方法指南
Aug 31 Python
python处理PHP数组文本文件实例
Sep 18 Python
基python实现多线程网页爬虫
Sep 06 Python
python套接字流重定向实例汇总
Mar 03 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
什么是Python中的顺序表
Jun 02 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
通俗讲解python 装饰器
Sep 07 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 #Python
python3.6根据m3u8下载mp4视频
Jun 17 #Python
python如何实现视频转代码视频
Jun 17 #Python
python批量爬取下载抖音视频
Jun 17 #Python
python批量下载抖音视频
Jun 17 #Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 #Python
python文本数据处理学习笔记详解
Jun 17 #Python
You might like
一个odbc连mssql分页的类
2006/10/09 PHP
BBS(php & mysql)完整版(五)
2006/10/09 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
使用变量动态设置js的属性名
2014/10/19 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
探究Python中isalnum()方法的使用
2015/05/18 Python
python实现发送邮件功能
2017/07/22 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
介绍一下游标
2012/01/10 面试题
化验室技术员岗位职责
2013/12/24 职场文书
转党组织关系介绍信
2014/01/08 职场文书
双方协议书
2014/04/22 职场文书
物理学专业自荐信
2014/06/11 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
公司催款律师函
2015/05/27 职场文书
小时代观后感
2015/06/10 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书