2017-06-05 131 views
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(),那么它工作得很好。我在想,线程的数量可能会造成麻烦,但我不知道如何解决它。

+0

拥有QApplication,在sem.release()之前的processEvents()不会有帮助,因为这是一个选项。 –

+0

另外,你在哪里获得信号量? –

+0

我不确定。当我设置了一个我正在获取它的地方时,它引发了一些问题,并且将这部分看起来让事情变得更好 –

回答

0

显然它是由.join命令引起的。他们显然阻止了GUI在某种程度上的刷新。我希望这能帮助未来的人。