2017-09-26 3 views
0

Je crée un projet Python avec PyQT5 qui combine une classe écrite par moi et une autre écrite par quelqu'un d'autre. La deuxième classe est ouverte dans une nouvelle fenêtre pour afficher les données lues à partir de la communication série. J'ai maintenant le problème, que quand je ferme mon programme avant que la deuxième fenêtre apparaisse, le port COM ouvert par la deuxième classe pendant que l'instanciation n'est pas fermée correctement, ainsi je ne peux pas courir mon programme encore. Comment puis-je gérer ce port COM de sorte qu'il n'est pas ouvert trop tôt ou qu'il est fermé correctement?Gérer les ports COM dans une autre classe

Mon code ressemble à ceci:

class SecondWindow(SecondWindowClass): 

    def closeThis(self): 
     self.ser.close() 
     self.close() 
     self.first.show() 

    def __init__(self, first): 
     #SecondWindowClass.__init__(self) 

     super(SecondWindow, self).__init__() 
     self.first = first 
     self.ui = WindowTemplate() 
     self.ui.setupUi(self) 

     self.show() 

     print("Now opening COM port") 
     self.ser = serial.Serial('COM1', 9600, timeout=1) 
     print("COM1 opened") 
     #line = self.ser.readline() # first line is trash 
     self.ser.flush() 
     print("flushed COM11") 
     self.ui.pushButton.clicked.connect(lambda x:self.closeThis()) 

class MainWindow(QtGui.QMainWindow, Ui_MainWindow): 

    def showSecond(self): 
     self.second.show() 
     self.hide() 
     self.ui.end_button.clicked.connect(lambda x:self.nextPicture()) 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     Ui_MainWindow.__init__(self) 
     self.setWindowTitle('pyqtgraph example: Qt Designer') 
     self.ui=uic.loadUi(uiFile, self) 
     self.setupUi(self) 

     self.show() 
     self.second = SecondWindow(self) 
     self.second.hide() 
     self.ui.end_button.clicked.connect(lambda x:self.showSecond()) 
win = MainWindow() 

if __name__ == '__main__': 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 

Répondre

0

J'ai trouvé une solution à l'aide closeEvent:

class MainWindow(QtGui.QMainWindow, Ui_MainWindow): 

    def closeEvent(self, evnt): # Use the closing event 
     if isinstance(self.second, SecondWindow): # Check if instance already exists 
      try: # Close port if possible 
       self.second.ser.close() 
       print("Port closed") 
      except(RuntimeError, TypeError, NameError): 
       print("no serial port") 
[...]