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使用win32com库播放mp3文件的方法
May 30 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
django反向解析和正向解析的方式
Jun 05 Python
利用Python如何批量更新服务器文件
Jul 29 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
Apr 27 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
如何利用Python模拟GitHub登录详解
Jul 15 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
Python 实现try重新执行
Dec 21 Python
python数据分析:关键字提取方式
Feb 24 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 02 Python
Python进度条的使用
May 17 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
如何开发一个虚拟域名系统
2006/10/09 PHP
php中几种常见安全设置详解
2010/04/06 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
python中requests库session对象的妙用详解
2017/10/30 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
python数据预处理方式 :数据降维
2020/02/24 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
美国眼镜网:GlassesUSA
2017/09/07 全球购物
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
污水厂厂长岗位职责
2014/01/04 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
旅游投诉信范文
2015/07/02 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书