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类继承用法实例分析
Oct 10 Python
深入浅出学习python装饰器
Sep 29 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
django 发送手机验证码的示例代码
Apr 25 Python
Python使用装饰器模拟用户登陆验证功能示例
Aug 24 Python
详解Django 时间与时区设置问题
Jul 23 Python
seek引发的python文件读写的问题及解决
Jul 26 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
Python3运算符常见用法分析
Feb 14 Python
Python安装OpenCV的示例代码
Mar 05 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
几个学习PHP的网址
2006/11/25 PHP
PHP开发框架总结收藏
2008/04/24 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
javascript输出AscII码扩展集中的字符方法
2016/12/26 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
p5.js入门教程之键盘交互
2018/03/19 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
使用TensorFlow实现SVM
2018/09/06 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
加拿大租车网站:Enterprise Rent-A-Car
2018/07/26 全球购物
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
农田水利实习自我鉴定
2013/09/19 职场文书
普师专业个人自荐信范文
2013/11/26 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript