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 相关文章推荐
php使用递归与迭代实现快速排序示例
Jan 23 Python
python让图片按照exif信息里的创建时间进行排序的方法
Mar 16 Python
深入理解Python中装饰器的用法
Jun 28 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
Python处理文本换行符实例代码
Feb 03 Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
python的sorted用法详解
Jun 25 Python
Python ATM功能实现代码实例
Mar 19 Python
python实现文法左递归的消除方法
May 22 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
Django利用AJAX技术实现博文实时搜索
May 06 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基础教程
2015/08/26 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
JS实现切换标签页效果实例代码
2013/11/01 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
再谈javascript原型继承
2014/11/10 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
vue filters的使用详解
2018/06/11 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
Python 第一步 hello world
2009/09/25 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
python pygame实现球球大作战
2019/11/25 Python
vscode调试django项目的方法
2020/08/06 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
幼师自荐信范文
2013/10/06 职场文书
商务日语毕业生自荐信
2013/11/23 职场文书
自主招生自荐信指南
2014/02/04 职场文书
跳槽求职信范文
2014/05/26 职场文书
2014年材料员工作总结
2014/11/19 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书