中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

pyqt5 tablewidget 利用線程動態刷新數據的方法

發布時間:2020-09-29 05:25:10 來源:腳本之家 閱讀:374 作者:請叫我西木同學 欄目:開發技術

問題

知道要用線程,所以就先嘗試寫了一個線程,然后每次都獲取數據,然后直接通過這種方法來朝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 利用線程動態刷新數據的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

水城县| 大余县| 东平县| 商丘市| 宜春市| 沂水县| 绥棱县| 普定县| 西平县| 安泽县| 浠水县| 乌苏市| 绥宁县| 乌鲁木齐县| 潢川县| 贵定县| 贺州市| 锡林浩特市| 年辖:市辖区| 宜都市| 岗巴县| 日喀则市| 伊金霍洛旗| 砚山县| 高台县| 兴海县| 台江县| 广宁县| 哈尔滨市| 霍林郭勒市| 满洲里市| 太湖县| 沁源县| 察雅县| 玉山县| 印江| 安仁县| 东城区| 台前县| 迁西县| 兖州市|