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的迭代器、生成器以及相关的itertools包
Apr 02 Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 Python
对python 判断数字是否小于0的方法详解
Jan 26 Python
Python closure闭包解释及其注意点详解
Aug 28 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
python或C++读取指定文件夹下的所有图片
Aug 31 Python
python+opencv实现车牌定位功能(实例代码)
Dec 24 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 Python
keras 多gpu并行运行案例
Jun 10 Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 Python
python 读取yaml文件的两种方法(在unittest中使用)
Dec 01 Python
如何用python绘制雷达图
Apr 24 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
php限制文件下载速度的代码
2015/10/20 PHP
php无限分类使用concat如何实现
2015/11/05 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
如何运行Python程序的方法
2013/04/21 Python
Python抓取百度查询结果的方法
2015/07/08 Python
Python实现的归并排序算法示例
2017/11/21 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
基于python指定包的安装路径方法
2018/10/27 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
Numpy数组的广播机制的实现
2020/11/03 Python
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
考博专家推荐信模板
2013/12/02 职场文书
企业统计员岗位职责
2013/12/13 职场文书
影视动画专业个人的自我评价
2013/12/31 职场文书
探矿工程师自荐信
2014/01/24 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
采购部长岗位职责
2014/06/13 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle