pyqt5 tablewidget 利用線程動態(tài)刷新數(shù)據(jù)的方法
問題
知道要用線程,所以就先嘗試寫了一個線程,然后每次都獲取數(shù)據(jù),然后直接通過這種方法來朝table里面更新數(shù)據(jù)。
#python代碼 table=MainWindow_ui.tableWidget_2 table.setItem(i,0,QtWidgets.QTableWidgetItem(str(jcb.Name)))
發(fā)現(xiàn)數(shù)據(jù)并不是想象中跟線程運行那樣實時的,要點一下才能顯示出數(shù)據(jù)來
并且還會出現(xiàn)一些問題
問題圖片
為了做出對比,我將作業(yè)名的表格填寫改成table.setItem的方式,其他格子用信號量機制,可以很清楚的看到問題所在?。。?!

解決方法
核心是要通過qt的槽函數(shù)來發(fā)射信號告知qt窗口的組件來進行更新,如果是直接程序上來“發(fā)射接受”信號,而不通過qt的槽函數(shù)來弄就會出現(xiàn)問題
thread函數(shù)
原本class里面自己寫的是一個python的threading包的線程,利用threading.Event()來進行進程阻塞,沒想到直接修改成 QtCore.QThread,兩個混合在一起也能用。。。
class Job(QtCore.QThread):#注意這里使用的是qt自己本身的線程,而不能用python自己的線程
signal2=QtCore.pyqtSignal(tuple)#因為這個信號槽要繼承于Qobject,不然會發(fā)生沒有emit,connect函數(shù)的報錯,括號里面填寫的是發(fā)射的數(shù)據(jù)類型
def signal2emit(self,var:tuple):
self.signal2.emit(var)#朝connect的函數(shù)發(fā)射一個tuple
def __init__(self, *args, **kwargs):#這里自己實現(xiàn)
super(Job, self).__init__(*args, **kwargs)
self.__flag = threading.Event() # 用于暫停線程的標識
self.__flag.set() # 設(shè)置為True
self.__running = threading.Event() # 用于停止線程的標識
self.__running.set() # 將running設(shè)置為True
self.signal2.connect(setItem)#連接發(fā)射函數(shù)
def run(self):
global SystemTime,TimePice#聲明要用的全局變量
while self.__running.isSet():#如果被設(shè)置為了true就繼續(xù),false就終止了
self.__flag.wait() # 為True時立即返回, 為False時阻塞直到內(nèi)部的標識位為True后返回
###################
#這里寫線程要干的事情#
###################
time.sleep(1)
def pause(self):
self.__flag.clear() # 設(shè)置為False, 讓線程阻塞
def resume(self):
self.__flag.set() # 設(shè)置為True, 讓線程停止阻塞
def stop(self):
self.__flag.set() # 將線程從暫停狀態(tài)恢復(fù), 如何已經(jīng)暫停的話
self.__running.clear() # 設(shè)置為False
setItem函數(shù),接受信號量
def setItem(var:tuple):#用于向jcb表格填寫內(nèi)容
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)#這是個進度條來的
朝表格中填寫數(shù)據(jù)的函數(shù)
這是放在主線程中該干的事情的一部分
其中注釋掉的部分就是之前直接朝表格中set數(shù)據(jù)的部分,這是不行的,要通過Qthread來發(fā)射信號量
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))
成果
這樣就順利實現(xiàn)了table widget的動態(tài)更新數(shù)據(jù)

以上這篇pyqt5 tablewidget 利用線程動態(tài)刷新數(shù)據(jù)的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
更換Django默認的模板引擎為jinja2的實現(xiàn)方法
今天小編就為大家分享一篇更換Django默認的模板引擎為jinja2的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python實現(xiàn)刪除windows下的長路徑文件
這篇文章主要為大家詳細介紹一下如何利用Python語言實現(xiàn)刪除windows下的長路徑文件功能,文中的示例代碼講解詳細,具有一定參考借鑒價值,感興趣的可以了解一下2022-07-07
分析語音數(shù)據(jù)增強及python實現(xiàn)
數(shù)據(jù)增強是一種生成合成數(shù)據(jù)的方法,即通過調(diào)整原始樣本來創(chuàng)建新樣本。這樣我們就可獲得大量的數(shù)據(jù)。這不僅增加了數(shù)據(jù)集的大小,還提供了單個樣本的多個變體,這有助于我們的機器學(xué)習(xí)模型避免過度擬合2021-06-06
OpenCV學(xué)習(xí)記錄python實現(xiàn)連通域處理函數(shù)
這篇文章主要為大家介紹了OpenCV學(xué)習(xí)記錄python實現(xiàn)連通域處理函數(shù)cv2.connectedComponentsWithStats()和cv2.connectedComponents()的使用示例詳解2022-06-06
python 列出面板數(shù)據(jù)所有變量名的示例代碼
在Python中,處理面板數(shù)據(jù)(Panel Data)通常使用pandas庫,特別是當數(shù)據(jù)以DataFrame或Panel,這篇文章主要介紹了python 列出面板數(shù)據(jù)所有變量名,需要的朋友可以參考下2024-06-06

