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实现图片批量剪切示例
Mar 25 Python
Python中的urllib模块使用详解
Jul 07 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 Python
Python生成数字图片代码分享
Oct 31 Python
python中学习K-Means和图片压缩
Nov 20 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
Python导入数值型Excel数据并生成矩阵操作
Jun 09 Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 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
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
JS前端框架关于重构的失败经验分享
2013/03/17 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
etmvc+jQuery EasyUI+combobox多值操作实现角色授权实例
2016/11/09 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
详解使用mocha对webpack打包的项目进行"冒烟测试"的大致流程
2020/04/27 Javascript
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
Python中的sort()方法使用基础教程
2017/01/08 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
计划生育证明书写要求
2014/09/17 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
高一地理教学工作总结
2015/08/12 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
《给予树》教学反思
2016/03/03 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript