2017-09-26 3 views
0

Ich erstelle ein Python-Projekt mit PyQT5, das eine von mir geschriebene Klasse und eine von jemand anderem geschriebene Klasse kombiniert. Die zweite Klasse wird in einem neuen Fenster geöffnet, um Daten anzuzeigen, die von der seriellen Kommunikation gelesen werden. Ich habe jetzt das Problem, dass, wenn ich mein Programm schließe, bevor das zweite Fenster erscheint, der von der zweiten Klasse geöffnete COM-Port während der Instanziierung nicht richtig geschlossen wird, so dass ich mein Programm nicht erneut ausführen kann. Wie kann ich diesen COM-Port so handhaben, dass er nicht zu früh geöffnet oder ordnungsgemäß geschlossen wird?Behandle COM-Ports in einer anderen Klasse

Mein Code sieht wie folgt aus:

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_() 

Antwort

0

ich eine Lösung mit closeEvent gefunden:

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") 
[...] 
Verwandte Themen