您好,登錄后才能下訂單哦!
問題
知道要用線程,所以就先嘗試寫了一個線程,然后每次都獲取數據,然后直接通過這種方法來朝table里面更新數據。
#python代碼 table=MainWindow_ui.tableWidget_2 table.setItem(i,0,QtWidgets.QTableWidgetItem(str(jcb.Name)))
發現數據并不是想象中跟線程運行那樣實時的,要點一下才能顯示出數據來
并且還會出現一些問題
問題圖片
為了做出對比,我將作業名的表格填寫改成table.setItem的方式,其他格子用信號量機制,可以很清楚的看到問題所在!!!!
解決方法
核心是要通過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 利用線程動態刷新數據的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。