for i in range(3): child1 = QStandardItem("Property") child1.setEditable(False) child2 = QStandardItem("Value") model.appendRow([child1, child2]) treeView.resize(QSize(100, 100)) layout = QHBoxLayout() layout.addWidget(treeView) layout.addWidget(view) layout.addWidget(textEdit) w.setLayout(layout) mainWindow.menuBar().addMenu("File") mainWindow.menuBar().addMenu("Help") toolBar = QToolBar() toolBar.setGeometry(QRect(100, 100, 100, 100)) toolBar.addAction("Node") toolBar.addAction("Edge") mainWindow.addToolBar(Qt.LeftToolBarArea, toolBar) mainWindow.setCentralWidget(w) mainWindow.showMaximized() sys.exit(app.exec_())
class Window(QMainWindow): def __init__(self): super().__init__() self.Title_list = [ "PW", " PA ", "Signal\nCategory", "PRI", "PRI \n Min", "PRI \n Max", "Scan \n Type", "Scan \n Rate" ] title = "Radar Pulse Analyser" left = 500 top = 300 width = 800 height = 600 iconName = "icon.png" self.ServerStopFlag = False self.ClearDispCount = 0 self.setWindowTitle(title) self.setWindowIcon(QtGui.QIcon(iconName)) self.setGeometry(left, top, width, height) self.UiComponents() self.show() # self.Text.append("Server Started") self.Server_Start() ################################################################################################################### def UiComponents(self): self.toolbar = QToolBar(self) self.toolbar.setMovable(False) self.toolbar.setStyleSheet("background-color : white") self.toolbar.setGeometry(QRect(0, 0, 800, 60)) self.Text = QTextEdit(self) self.Text.move(0, 500) self.Text.resize(800, 100) self.button = QPushButton("Start Pulse Analysis", self) self.button.move(150, 150) self.button.setGeometry(QRect(10, 455, 180, 40)) self.button1 = QPushButton("Stop Pulse Analysis", self) self.button1.move(40, 40) self.button1.setGeometry(QRect(200, 455, 180, 40)) self.button2 = QPushButton("Clear", self) self.button2.move(50, 50) self.button2.setGeometry(QRect(390, 455, 180, 40)) self.button3 = QPushButton("Save PDW", self) self.button3.setGeometry(QRect(580, 455, 180, 40)) self.ActplotDTOA = QAction("PLSCMT\nVS\nDTOA", self) self.ActplotHistPRI = QAction("Histogram", self) self.ActplotHistPW = QAction("PA\nVS\nDTOA", self) self.toolbar.addAction(self.ActplotDTOA) self.toolbar.addAction(self.ActplotHistPRI) self.toolbar.addAction(self.ActplotHistPW) self.tableWidget = QTableWidget(self) self.tableWidget.setGeometry(QRect(10, 60, 775, 380)) font = QtGui.QFont() font.setBold(True) font.setPointSize(9) font.setItalic(True) font.setWeight(75) self.tableWidget.setFont(font) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(8) self.tableWidget.horizontalHeader().setSectionResizeMode( QHeaderView.Stretch) self.tableWidget.setHorizontalHeaderLabels(self.Title_list) self.button.clicked.connect(self.Server_Start) self.button1.clicked.connect(self.Server_Stop) self.button2.clicked.connect(self.Clear) self.button3.clicked.connect(self.savePDW) self.ActplotDTOA.triggered.connect(self.plotDTOA) self.ActplotHistPRI.triggered.connect(self.plotHistPRI) self.ActplotHistPW.triggered.connect(self.plotHistPW) self.button.setEnabled(False) self.CurRowInd = 0 self.thread = MyThread() # self.thread.change_value.connect(self.setProgressVal) self.thread.StopFlag = False self.thread.start() self.thread.StartPulseAnalysis = False # self.thread.pd_PDW_Update.connect(self.updateGraphs) # self.thread.Track_Update.connect(self.updateTrackTable) self.thread.updatePDW.connect(self.ExtractPDW) self.RAW_DTOA = np.empty(0, dtype='u4') self.PulseWidth = np.empty(0, dtype='u4') self.PulseAmpl = np.empty(0, dtype='u4') self.PDWUpdateFlag = False self.timer = QTimer(self) #self.timer = 2000 # self.timer.timeout(2000) self.timer.timeout.connect(self.ExtractPulseParam) ############################################################################################################ def plotDTOA(self): if self.SignalType == 'JITTER': Plot_DTOA(self.RAW_DTOA, x_lim2=500) else: Plot_DTOA(self.RAW_DTOA, x_lim2=100) def plotHistPRI(self): Plot_DTOA_Hist(self.RAW_DTOA) def plotHistPW(self): Plot_DTOA_Hist(self.PulseWidth) def ExtractPDW(self, recv_data): # self.Text.append('Extract PDW') PW, PA, D_TOA = Extract_PDW(recv_data[1:]) self.RAW_DTOA = np.concatenate((self.RAW_DTOA, D_TOA), axis=0) self.PulseWidth = np.concatenate((self.PulseWidth, PW), axis=0) self.PulseAmpl = np.concatenate((self.PulseAmpl, PA), axis=0) self.PDWUpdateFlag = True ##################################################################################################################### def ExtractPulseParam(self): self.Text.append('Pulse Count' + str(len(self.RAW_DTOA))) # self.CurRowInd = self.tableWidget.rowCount() # self.tableWidget.setRowCount(self.CurRowInd+1) if self.PDWUpdateFlag == True: try: self.tableWidget.setRowCount(self.CurRowInd + 1) # self.CurRowInd = 1 if len(self.RAW_DTOA > 1000): TrackData = GetPRI(self.RAW_DTOA[-1000:]) TrackData['Pulse Width'] = GetPW(self.PulseWidth[-1000:]) else: TrackData = GetPRI(self.RAW_DTOA) TrackData['Pulse Width'] = GetPW(self.PulseWidth) print(TrackData) self.SignalType = TrackData.get('Signal Category') self.Text.clear() self.Text.append(str(TrackData)) PW = f'''{TrackData['Pulse Width']}''' PA = f'''{TrackData['Pulse Amplitude']}''' PRI = f'''{TrackData['PRI']}''' minPRI = f'''{TrackData['Min PRI']}''' maxPRI = f'''{TrackData['Max PRI']}''' ScanRate = f'''{TrackData['Scan Rate']}''' self.tableWidget.setItem(self.CurRowInd, 0, QTableWidgetItem(PW)) self.tableWidget.setItem(self.CurRowInd, 1, QTableWidgetItem(PA)) self.tableWidget.setItem( self.CurRowInd, 2, QTableWidgetItem(TrackData.get('Signal Category'))) self.tableWidget.setItem(self.CurRowInd, 3, QTableWidgetItem(PRI)) self.tableWidget.setItem(self.CurRowInd, 4, QTableWidgetItem(minPRI)) self.tableWidget.setItem(self.CurRowInd, 5, QTableWidgetItem(maxPRI)) self.tableWidget.setItem( self.CurRowInd, 6, QTableWidgetItem(TrackData.get('Scan Type'))) self.tableWidget.setItem(self.CurRowInd, 7, QTableWidgetItem(ScanRate)) # print (GetPW(PulseWidth)) #self.Track_Update.emit(TrackData) except: self.Text.append('No PDWs in Buffer') self.PDWUpdateFlag = False self.timer.start(2000) #Munny Write here to insert into table TrackData #self.savePDW() #################################################################################################################### def savePDW(self): TOA = [] TOA.append(0) for i in range(1, len(self.RAW_DTOA)): TOA.append(TOA[i - 1] + self.RAW_DTOA[i - 1]) pdwdata = [] # for i in range(1000): # pdwdata.append([PulseWidth[i], PulseAmpl[i], RAW_DTOA[i], TOA[i]]) try: df = pd.DataFrame(columns=['TOA', 'PW', 'PA', 'DTOA']) df['PW'] = self.PulseWidth df['PA'] = self.PulseAmpl df['DTOA'] = self.RAW_DTOA df['TOA'] = TOA df.to_csv('pdw.csv') # self.pd_PDW_Update.emit(df) except: print('Error') ################################################################################################################### def Server_Start(self): self.Clear() self.Text.append("Pulse Analysis Started") self.RAW_DTOA = np.empty(0, dtype='u4') self.PulseWidth = np.empty(0, dtype='u4') self.PulseAmpl = np.empty(0, dtype='u4') self.button.setEnabled(False) self.button1.setEnabled(True) # self.Text.append("Server Started") self.thread.StartPulseAnalysis = True self.timer.start(2000) ################################################################################################################### def Server_Stop(self): # self.thread.StopFlag = True self.button.setEnabled(True) self.button1.setEnabled(False) self.Text.append("Pulse Analysis Stopped") self.thread.StartPulseAnalysis = False #self.thread.exit() #self.ServerStopFlag = True self.timer.stop() ################################################################################################################### def updateGraphs(self, df_Pdw): print('Update Graphs') # print(df_Pdw.head()) # Munny write here for Graphs updation def updateTrackTable(self, TrackData): print('Update Table') print(TrackData) # Munny Write here for Tbale updation ####################################################################################################################### def Clear(self): self.Text.clear()
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__(None) self.config = Configuration() self.config.readConfig(self.config.configFile) self.initUI() # Define UI elements def initUI(self): logger.info("SpecAnalyzer v." + __version__) self.setWindowTitle("SpecAnalyzer %s" % __version__) self.setGeometry(10, 30, 340, 220) self.setFixedSize(self.size()) self.aboutwid = AboutWidget() self.resultswind = ResultsWindow(parent=self) self.camerawind = CameraWindow(parent=self) self.weblinks = WebLinksWidget() self.acquisition = Acquisition(parent=self) self.acquisitionwind = AcquisitionWindow(parent=self) self.powermeterwind = PowermeterWindow(parent=self) self.sourcemeterwind = SourcemeterWindow(parent=self) self.deviceLabel = QLabel(self) self.deviceLabel.setGeometry(QRect(10, 30, 100, 20)) self.deviceLabel.setText("Name:") self.deviceText = QLineEdit(self) self.deviceText.setText("") self.deviceText.setGeometry(QRect(130, 30, 200, 20)) self.commentsLabel = QLabel(self) self.commentsLabel.setGeometry(QRect(10, 60, 100, 20)) self.commentsLabel.setText("Comments:") self.commentsText = QLineEdit(self) self.commentsText.setText("") self.commentsText.setGeometry(QRect(130, 60, 200, 20)) self.deviceAreaLabel = QLabel(self) self.deviceAreaLabel.setGeometry(QRect(10, 90, 120, 20)) self.deviceAreaLabel.setText("Device area [cm\u00B2]:") self.deviceAreaText = QLineEdit(self) self.deviceAreaText.setText(str(self.config.deviceArea)) self.deviceAreaText.editingFinished.connect(self.setDeviceArea) self.deviceAreaText.setGeometry(QRect(130, 90, 100, 20)) # Create menu and toolbar self.menuBar = QMenuBar(self) self.menuBar.setGeometry(0, 0, 340, 25) self.toolBar = QToolBar(self) self.toolBar.setGeometry(0, 170, 340, 25) # Menu entries self.loadConfigMenu = QAction("&Load Configuration", self) self.loadConfigMenu.setShortcut("Ctrl+Shift+o") self.loadConfigMenu.setStatusTip('Quit') self.loadConfigMenu.triggered.connect(self.loadConfig) self.saveConfigMenu = QAction("&Save Configuration", self) self.saveConfigMenu.setShortcut("Ctrl+Shift+s") self.saveConfigMenu.setStatusTip('Quit') self.saveConfigMenu.triggered.connect(self.saveConfig) self.loadMenu = QAction("&Load Data", self) self.loadMenu.setShortcut("Ctrl+o") self.loadMenu.setStatusTip('Load csv data from saved file') self.loadMenu.triggered.connect(self.resultswind.read_csv) self.directoryMenu = QAction("&Set directory for saved files", self) self.directoryMenu.setShortcut("Ctrl+d") self.directoryMenu.setStatusTip('Set directory for saved files') self.directoryMenu.triggered.connect(self.resultswind.set_dir_saved) self.quitMenu = QAction("&Quit", self) self.quitMenu.setShortcut("Ctrl+q") self.quitMenu.setStatusTip('Quit') self.quitMenu.triggered.connect(self.fileQuit) fileMenu = self.menuBar.addMenu('&File') fileMenu.addAction(self.quitMenu) fileMenu.addSeparator() fileMenu.addAction(self.loadMenu) fileMenu.addAction(self.directoryMenu) fileMenu.addSeparator() fileMenu.addAction(self.loadConfigMenu) fileMenu.addAction(self.saveConfigMenu) self.powermeterMenu = QAction("&Powermeter", self) self.powermeterMenu.setShortcut("Ctrl+p") self.powermeterMenu.setStatusTip('Powermeter controls') self.powermeterMenu.triggered.connect(self.powermeterwind.show) self.sourcemeterMenu = QAction("&Sourcemeter", self) self.sourcemeterMenu.setShortcut("Ctrl+k") self.sourcemeterMenu.setStatusTip('Sourcemeter controls') self.sourcemeterMenu.triggered.connect(self.sourcemeterwind.show) self.cameraMenu = QAction("&Camera", self) self.cameraMenu.setShortcut("Ctrl+c") self.cameraMenu.setStatusTip('Camera controls') self.cameraMenu.triggered.connect(self.camerawind.show) instrumentsMenu = self.menuBar.addMenu('&Instruments') instrumentsMenu.addAction(self.sourcemeterMenu) instrumentsMenu.addSeparator() instrumentsMenu.addAction(self.powermeterMenu) instrumentsMenu.addAction(self.cameraMenu) self.viewWindowMenus(self.menuBar, self) self.helpMenu = QAction("&Help", self) self.helpMenu.setShortcut("Ctrl+h") self.helpMenu.setStatusTip('Help') self.helpMenu.triggered.connect(self.weblinks.help) self.devBugsMenu = QAction("&Development and Bugs", self) self.devBugsMenu.setShortcut("Ctrl+b") self.devBugsMenu.setStatusTip('Development and bugs') self.devBugsMenu.triggered.connect(self.weblinks.help) self.aboutMenu = QAction("&About", self) self.aboutMenu = QAction("&About", self) self.aboutMenu.setShortcut("Ctrl+a") self.aboutMenu.setStatusTip('About') self.aboutMenu.triggered.connect(self.aboutwid.show) aboutMenu = self.menuBar.addMenu('&Help') aboutMenu.addAction(self.helpMenu) aboutMenu.addAction(self.devBugsMenu) aboutMenu.addSeparator() aboutMenu.addAction(self.aboutMenu) # Toolbar Entries # self.acquisitionToolbar = QAction("&Acquisition", self) self.acquisitionToolbar.setShortcut("Ctrl+a") self.acquisitionToolbar.setStatusTip('Acquisition paramenters') self.acquisitionToolbar.triggered.connect(self.acquisitionwind.show) self.resultsToolbar = QAction("&Results", self) self.resultsToolbar.setShortcut("Ctrl+p") self.resultsToolbar.setStatusTip('Results Panel') self.resultsToolbar.triggered.connect(self.resultswind.show) self.cameraToolbar = QAction("&Camera", self) self.cameraToolbar.setShortcut("Ctrl+c") self.cameraToolbar.setStatusTip('Camera and alignment') self.cameraToolbar.triggered.connect(self.camerawind.show) #toolBar = self.addToolBar("&Toolbar") self.toolBar.addAction(self.acquisitionToolbar) self.toolBar.addSeparator() self.toolBar.addAction(self.resultsToolbar) self.toolBar.addSeparator() self.toolBar.addAction(self.cameraToolbar) self.toolBar.addSeparator() #### Create status bar #### self.statusBar = QStatusBar() self.setStatusBar(self.statusBar) self.statusBarLabel = QLabel(self) self.statusBar.addPermanentWidget(self.statusBarLabel, 1) self.statusBarLabel.setText("System: ready") #self.statusBar().showMessage("Ready", 5000) #### Create basic push buttons to run acquisition #### self.startAcqButton = QPushButton(self) self.startAcqButton.setGeometry(QRect(10, 120, 160, 40)) self.startAcqButton.setObjectName("Start Acquisition") self.startAcqButton.setText("Start Acquisition") self.startAcqButton.clicked.connect(self.acquisition.start) self.stopAcqButton = QPushButton(self) self.stopAcqButton.setGeometry(QRect(170, 120, 160, 40)) self.stopAcqButton.setObjectName("Stop Acquisition") self.stopAcqButton.setText("Stop Acquisition") self.stopAcqButton.setEnabled(False) self.stopAcqButton.clicked.connect(self.acquisition.stop) # Logic for loading parameters from a configuration file def loadConfig(self): filename = QFileDialog.getOpenFileName(self, "Open INI config file", "", "*.ini") self.config.readConfig(filename) print("Confguration parameters loaded from:", filename[0]) logger.info("Confguration parameters loaded from:" + filename[0]) # Logic for saving parameters to a configuration file def saveConfig(self): filename = QFileDialog.getSaveFileName(self, "Save INI config file", "", "*.ini") self.config.saveConfig(filename[0]) print("Confguration parameters saved to:", filename[0]) logger.info("Confguration parameters saved to:" + filename[0]) # Logic to save deviceArea on config when done editing the corresponding field def setDeviceArea(self): self.config.conf['Devices']['deviceArea'] = str( self.deviceAreaText.text()) self.config.saveConfig(self.config.configFile) self.config.readConfig(self.config.configFile) # When closing the MainWindow, all windows need to close as we.. def fileQuit(self): QApplication.closeAllWindows() # Enable/disable buttons def enableButtonsAcq(self, flag): if flag is False: self.startAcqButton.setText("Acquisition Running...") else: self.startAcqButton.setText("Start Acquisition") self.startAcqButton.setEnabled(flag) self.stopAcqButton.setEnabled(not flag) self.deviceText.setEnabled(flag) self.commentsText.setEnabled(flag) self.deviceAreaText.setEnabled(flag) # Adds Menus to expose other Windows. def viewWindowMenus(self, menuObj, obj): viewMainWindowMenu = QAction("&Main Window", self) viewMainWindowMenu.setShortcut("Ctrl+w") viewMainWindowMenu.setStatusTip('Display Main Window') viewMainWindowMenu.triggered.connect( lambda: self.displayMainWindow(obj)) viewAcquisitionMenu = QAction("&Acquisition Window", self) viewAcquisitionMenu.setShortcut("Ctrl+a") viewAcquisitionMenu.setStatusTip('Display Acquisition Window') viewAcquisitionMenu.triggered.connect( lambda: self.displayMainWindow(obj.acquisitionwind)) viewResultsMenu = QAction("&Results Window", self) viewResultsMenu.setShortcut("Ctrl+r") viewResultsMenu.setStatusTip('Display Results Window') viewResultsMenu.triggered.connect( lambda: self.displayMainWindow(obj.resultswind)) viewCameraMenu = QAction("&Camera Window", self) viewCameraMenu.setShortcut("Ctrl+c") viewCameraMenu.setStatusTip('Display Camera Window') viewCameraMenu.triggered.connect( lambda: self.displayMainWindow(obj.camerawind)) windowMenu = menuObj.addMenu('&Window') windowMenu.addAction(viewMainWindowMenu) windowMenu.addAction(viewAcquisitionMenu) windowMenu.addAction(viewResultsMenu) windowMenu.addAction(viewCameraMenu) # Display main window def displayMainWindow(self, obj): obj.show() obj.setWindowState(obj.windowState() & Qt.WindowMinimized | Qt.WindowActive) obj.raise_() obj.activateWindow() # Logic to run when quitting the program # Dialog box for confirmation def closeEvent(self, event): quit_msg = "Are you sure you want to exit the program?" reply = QMessageBox.question(self, 'Message', quit_msg, QMessageBox.No, QMessageBox.Yes) if reply == QMessageBox.Yes: try: self.acquisition.acq_thread.stop() except: pass self.close() else: event.ignore()