PyQT не может запустить приложение дважды (ядро заморожено) - PullRequest
0 голосов
/ 27 января 2020

Запуск приложения PyQT на Jupyter Spyder ) Я обнаружил, что не могу запустить и завершить код дважды. Со второй попытки приложение закрывается, но ядро, похоже, зависло. Единственное решение, которое до сих пор работало, - это перезапустить ядро, но я sh нашел более элегантный способ go с это. Я пытался явно вызвать деструктор, но это не помогло. Предложения?

# main.py
import widget_ChamberPressure as wcp
app = wcp.QApplication([])
window = wcp.MatplotlibWidget()
window.show()
app.exec_()


# widget_ChamberPressure.py

class MatplotlibWidget(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        loadUi("qt_designer.ui",self)
        self.threadpool = QThreadPool()
        #self.ser = serial.Serial("COM5", baudrate=19200, bytesize=8, timeout=1, stopbits=1, parity=serial.PARITY_NONE)
        self.setWindowTitle("Pressure Widget")
        self.pushButton_generate_random_signal.clicked.connect(self.acquire_CG)
        self.addToolBar(NavigationToolbar(self.MplWidget.canvas, self))
        # set several cosmetic parameters of the plot
        self.l1, = self.MplWidget.canvas.axes.semilogy(np.nan, np.nan)
        self.l2, = self.MplWidget.canvas.axes.semilogy(np.nan, np.nan)

    def closeEvent(self, event):
        print('Closing')
        #self.ser.close()
        reply = QMessageBox.question(self, 'Close', "Are you Sure? \nAll your Inputs will be lost.", QMessageBox.Yes, QMessageBox.No)
        if reply == QMessageBox.Yes:
            sys.stdout = sys.__stdout__
            super().closeEvent(event)
            #event.accept()
        else:
            event.ignore()

    def acquire_CG(self):
        worker = wrk.Worker(self.update_CG_plot)
        self.threadpool.start(worker)

    def update_CG_plot(self, progress_callback):
        t0 = time.time()                # get initial time
        self.l1.set_xdata(np.array([])) # reset x_data
        self.l1.set_ydata(np.array([])) # reset y_data
        for i in range(0,5):
            s, t = self.fetch_CG()
            self.MplWidget.canvas.axes.relim()
            self.l1.set_xdata(np.append(self.l1.get_xdata(), t-t0)) # set x_data
            self.l1.set_ydata(np.append(self.l1.get_ydata(), s))    # set y_data
            self.MplWidget.canvas.axes.autoscale_view()             # automatic rescaling
            self.MplWidget.canvas.draw()

    def fetch_CG(self, name='02RDCG2'):
        #...reads data from sensor

# matplotlibwidget.py

class MplWidget(QWidget):
    def __init__(self, parent = None):
        QWidget.__init__(self, parent)
        self.canvas = FigureCanvas(Figure(tight_layout=True))
        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.canvas)
        self.canvas.axes = self.canvas.figure.add_subplot(111)
        self.setLayout(vertical_layout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...