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找出那些被“标记”的照片
Apr 20 Python
Python正则表达式常用函数总结
Jun 24 Python
Python读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
Python爬取个人微信朋友信息操作示例
Aug 03 Python
基于python指定包的安装路径方法
Oct 27 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
Django中的cookie和session
Aug 27 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
openCV提取图像中的矩形区域
Jul 21 Python
pytorch 如何使用amp进行混合精度训练
May 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
谈谈PHP语法(3)
2006/10/09 PHP
PHP操作文件方法问答
2007/03/16 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
jquery操作checkbox火狐下第二次无法勾选的解决方法
2016/10/10 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
浅谈Python中的作用域规则和闭包
2018/03/20 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
python实现定时发送qq消息
2019/01/18 Python
Python list与NumPy array 区分详解
2019/11/06 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
机械个人求职信范文
2014/01/24 职场文书
会计专业自我评价
2014/02/12 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
感恩教师节主题班会
2015/08/12 职场文书
公司晚会主持词
2019/04/17 职场文书
MySQL GRANT用户授权的实现
2021/06/18 MySQL
mysql中整数数据类型tinyint详解
2021/12/06 MySQL