0
嘿我想刷新GUI窗口,但由於某種原因,它不會刷新,直到所有的循環完成。我讀了其他帖子,並嘗試了他們的解決方案,但他們沒有幫助。有人能發現我做錯了什麼,或者我應該添加什麼嗎?代碼如下,從json文件讀取某些值並將它們存儲在GUI表中。我正在使用PyQt4和Python 2.7。先謝謝你。刷新PyQt4窗口
import sys
from PyQt4 import QtCore, QtGui
import time
from PyQt4.QtGui import QApplication
import json
import threading
from GUI_Window import *
LastCommandTime=0
class MyForm(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.button.clicked.connect(self.DataCollection)
def DataCollection(self):
print "button clicked"
task1=threading.Thread(target=self.DisplayCommand)
task1.start()
task2=threading.Thread(target=self.DisplayTemp)
task2.start()
task1.join()
task2.join()
def DisplayCommand(self):
start=time.time()
with open("20170602153617003.log") as f:
for line in f:
data = []
data=json.loads(line)
try:
if data['TYPE']== " cmd":
command= data["command"]
print "1"
self.ui.command_table.setItem(0,0, QtGui.QTableWidgetItem(command["cmd_name"]))
self.ui.command_table.setItem(0,1, QtGui.QTableWidgetItem(command["opcode"]))
self.ui.command_table.setItem(0,2, QtGui.QTableWidgetItem("".join((str(x)+',') for x in command["param_type_list"])))
self.ui.command_table.setItem(0,3, QtGui.QTableWidgetItem("".join((str(x)+',') for x in command["param_val_list"])))
self.ui.commands_time.display((time.time()-start))
start=time.time()
time.sleep(1)
if data['TYPE']== " cmd_reply":
command= data["response"]
self.ui.reply_table.setItem(0,0, QtGui.QTableWidgetItem(data["cmd_name"].replace(" ","")))
self.ui.reply_table.setItem(0,1, QtGui.QTableWidgetItem("0x%02x"%command["opcode"]))
self.ui.reply_table.setItem(0,2, QtGui.QTableWidgetItem(str(command["error_control_type"])))
self.ui.reply_table.setItem(0,3, QtGui.QTableWidgetItem(str(command["data_present"])))
self.ui.reply_table.setItem(0,4, QtGui.QTableWidgetItem(str(command["command_reply"])))
self.ui.reply_table.setItem(0,5, QtGui.QTableWidgetItem(str(command["status_flags"])))
self.ui.reply_table.setItem(0,6, QtGui.QTableWidgetItem(str(command["condition_code"])))
self.ui.reply_table.setItem(0,7, QtGui.QTableWidgetItem(str(command["data_length"])))
self.ui.reply_table.setItem(0,8, QtGui.QTableWidgetItem(str(command["data"])))
self.ui.reply_table.setItem(0,9, QtGui.QTableWidgetItem(str(command["error_control"])))
flags=command['flags']
self.ui.replyflg_table.setItem(0,0, QtGui.QTableWidgetItem(str(flags["BOOT_FAIL"])))
self.ui.replyflg_table.setItem(0,1, QtGui.QTableWidgetItem(str(flags["BOOT_SOURCE"])))
self.ui.replyflg_table.setItem(0,2, QtGui.QTableWidgetItem(str(flags["COMM_SIDE"])))
self.ui.replyflg_table.setItem(0,3, QtGui.QTableWidgetItem(str(flags["SELF_TEST_FAIL"])))
self.ui.replyflg_table.setItem(0,4, QtGui.QTableWidgetItem(str(flags["STA_ERROR"])))
self.ui.replyflg_table.setItem(0,5, QtGui.QTableWidgetItem(str(flags["SPECTROMETER_ERROR"])))
self.ui.replyflg_table.setItem(0,6, QtGui.QTableWidgetItem(str(flags["SCCD_READY"])))
self.ui.replyflg_table.setItem(0,7, QtGui.QTableWidgetItem(str(flags["SCANNER_ON"])))
self.ui.replyflg_table.setItem(0,8, QtGui.QTableWidgetItem(str(flags["SCANNER_COMM_ERROR"])))
self.ui.replyflg_table.setItem(0,9, QtGui.QTableWidgetItem(str(flags["SCANNER_HOME_ERROR"])))
self.ui.replyflg_table.setItem(0,10, QtGui.QTableWidgetItem(str(flags["ERROR_LOG_NOT_EMPTY"])))
self.ui.replyflg_table.setItem(0,11, QtGui.QTableWidgetItem(str(flags["SEND_EVR"])))
self.ui.replyflg_table.setItem(0,12, QtGui.QTableWidgetItem(str(flags["SYS_ERROR"])))
self.ui.replyflg_table.setItem(0,13, QtGui.QTableWidgetItem(str(flags["UNDEFINED0"])))
self.ui.replyflg_table.setItem(0,14, QtGui.QTableWidgetItem(str(flags["UNDEFINED1"])))
time.sleep(.1)
except KeyError:
time.sleep(.1)
pass
QApplication.processEvents()
def DisplayTemp(self):
i=0
while i<10:
print "hi"
self.ui.flt_table.setItem(0,0, QtGui.QTableWidgetItem(str(i)))
i=i+1
QApplication.processEvents()
time.sleep(.2)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = MyForm()
graphTimer = QtCore.QTimer()
graphTimer.timeout.connect(app.processEvents)
graphTimer.start(0.1)
myapp.show()
sys.exit(app.exec_())
此外,它似乎如果我註釋掉DisplayTemp(),那麼它工作得很好。我在想,線程的數量可能會造成麻煩,但我不知道如何解決它。
擁有QApplication,在sem.release()之前的processEvents()不會有幫助,因爲這是一個選項。 –
另外,你在哪裏獲得信號量? –
我不確定。當我設置了一個我正在獲取它的地方時,它引發了一些問題,並且將這部分看起來讓事情變得更好 –