def __init__(self, shared_state, computations_thread): super().__init__() self.setupUi(self) self._shared_state = shared_state self._computations_thread = computations_thread self._computations_thread.signal_starting.connect(self.computations_started) self._computations_thread.signal_finished.connect(self.computations_finished) self._stdout_old = sys.stdout self._stderr_old = sys.stderr self._logging_update_queue = Queue() self._logging_update_thread = QThread() self._message_receiver = MessageReceiver(self._logging_update_queue) self._message_receiver.text_message_signal.connect(self.update_log) self._message_receiver.moveToThread(self._logging_update_thread) self._logging_update_thread.started.connect(self._message_receiver.run) self._logging_update_thread.start() sys.stdout = ForwardingListener(self._logging_update_queue) sys.stderr = ForwardingListener(self._logging_update_queue) LogDispatchHandler.add_listener(ForwardingListener(self._logging_update_queue)) print_welcome_message() self.actionExit.setShortcuts(['Ctrl+q', 'Ctrl+w']) self.action_RuntimeSettings.triggered.connect(lambda: RuntimeSettingsDialog(self).exec_()) self.actionAbout.triggered.connect(lambda: AboutDialog(self).exec_()) self.action_GetExampleData.triggered.connect(lambda: GetExampleDataDialog(self, shared_state).exec_()) self.executionStatusLabel.setText('Idle') self.executionStatusIcon.setPixmap(QtGui.QPixmap(":/main_gui/icon_status_red.png")) self.fit_model_tab = FitModelTab(shared_state, self._computations_thread) self.fit_model_tab.setupUi(self.fitModelTab) self.generate_mask_tab = GenerateBrainMaskTab(shared_state, self._computations_thread) self.generate_mask_tab.setupUi(self.generateBrainMaskTab) self.view_results_tab = ViewResultsTab(shared_state, self._computations_thread) self.view_results_tab.setupUi(self.viewResultsTab) self.generate_roi_mask_tab = GenerateROIMaskTab(shared_state, self._computations_thread) self.generate_roi_mask_tab.setupUi(self.generateROIMaskTab) self.generate_protocol_tab = GenerateProtocolTab(shared_state, self._computations_thread) self.generate_protocol_tab.setupUi(self.generateProtocolTab) self.tabs = [self.fit_model_tab, self.generate_mask_tab, self.generate_roi_mask_tab, self.generate_protocol_tab, self.view_results_tab] self.MainTabs.currentChanged.connect(lambda index: self.tabs[index].tab_opened())
class MDTGUISingleModel(QMainWindow, Ui_MainWindow): def __init__(self, shared_state, computations_thread): super().__init__() self.setupUi(self) self._shared_state = shared_state self._computations_thread = computations_thread self._computations_thread.signal_starting.connect(self.computations_started) self._computations_thread.signal_finished.connect(self.computations_finished) self._stdout_old = sys.stdout self._stderr_old = sys.stderr self._logging_update_queue = Queue() self._logging_update_thread = QThread() self._message_receiver = MessageReceiver(self._logging_update_queue) self._message_receiver.text_message_signal.connect(self.update_log) self._message_receiver.moveToThread(self._logging_update_thread) self._logging_update_thread.started.connect(self._message_receiver.run) self._logging_update_thread.start() sys.stdout = ForwardingListener(self._logging_update_queue) sys.stderr = ForwardingListener(self._logging_update_queue) LogDispatchHandler.add_listener(ForwardingListener(self._logging_update_queue)) print_welcome_message() self.actionExit.setShortcuts(['Ctrl+q', 'Ctrl+w']) self.action_RuntimeSettings.triggered.connect(lambda: RuntimeSettingsDialog(self).exec_()) self.actionAbout.triggered.connect(lambda: AboutDialog(self).exec_()) self.action_GetExampleData.triggered.connect(lambda: GetExampleDataDialog(self, shared_state).exec_()) self.executionStatusLabel.setText('Idle') self.executionStatusIcon.setPixmap(QtGui.QPixmap(":/main_gui/icon_status_red.png")) self.fit_model_tab = FitModelTab(shared_state, self._computations_thread) self.fit_model_tab.setupUi(self.fitModelTab) self.generate_mask_tab = GenerateBrainMaskTab(shared_state, self._computations_thread) self.generate_mask_tab.setupUi(self.generateBrainMaskTab) self.view_results_tab = ViewResultsTab(shared_state, self._computations_thread) self.view_results_tab.setupUi(self.viewResultsTab) self.generate_roi_mask_tab = GenerateROIMaskTab(shared_state, self._computations_thread) self.generate_roi_mask_tab.setupUi(self.generateROIMaskTab) self.generate_protocol_tab = GenerateProtocolTab(shared_state, self._computations_thread) self.generate_protocol_tab.setupUi(self.generateProtocolTab) self.tabs = [self.fit_model_tab, self.generate_mask_tab, self.generate_roi_mask_tab, self.generate_protocol_tab, self.view_results_tab] self.MainTabs.currentChanged.connect(lambda index: self.tabs[index].tab_opened()) def closeEvent(self, event): sys.stdout = self._stdout_old sys.stderr = self._stderr_old self._message_receiver.is_running = False self._logging_update_thread.quit() self._logging_update_thread.wait(10) super().closeEvent(event) def send_sigint(self, *args): self.close() @pyqtSlot() def computations_started(self): self.executionStatusLabel.setText('Computing') self.executionStatusIcon.setPixmap(QtGui.QPixmap(":/main_gui/icon_status_green.png")) @pyqtSlot() def computations_finished(self): self.executionStatusLabel.setText('Idle') self.executionStatusIcon.setPixmap(QtGui.QPixmap(":/main_gui/icon_status_red.png")) @pyqtSlot(str) def update_log(self, string): sb = self.loggingTextBox.verticalScrollBar() scrollbar_position = sb.value() autoscroll = scrollbar_position == sb.maximum() self.loggingTextBox.moveCursor(QtGui.QTextCursor.End) self.loggingTextBox.insertPlainText(string) if autoscroll: sb.setValue(sb.maximum()) else: sb.setValue(scrollbar_position)