def run_statistics(self): text = self.comp_type_crt_text x_vals = [] y_vals = [] if text[:5] == "Inter": data_sets = [] for check_box in self.check_boxes: if check_box.isChecked(): data_sets.append(self.check_boxes[check_box]) metric = self.select_metric_inter.currentText() metric_alias = self.dict_metric_inter[metric] res = ResultsManager.get_results_inter(metric_alias, data_sets) # self.graphWidget.plot(data_sets, res) x_vals = data_sets y_vals = res elif text[:5] == "Intra": ds_name = self.intra_ds_current metric = self.select_metric_intra.currentText() metric_alias = self.dict_metric_intra[metric] names, res = ResultsManager.get_results_intra(metric_alias, ds_name) # self.graphWidget.plot(names, res) x_vals = names y_vals = res #horizontal bar chart_view = None if self.select_chart.currentIndex() == 0: chart = QChart(flags=Qt.WindowFlags()) series = QHorizontalBarSeries() for i in range(len(x_vals)): name = x_vals[i] set0 = QBarSet(name) set0.append(y_vals[i]) series.append(set0) chart.addSeries(series) if text[:5] == "Inter": chart.setTitle(f"Comparison by {self.select_metric_inter.currentText()}") else: chart.setTitle(f"Comparison by {self.select_metric_intra.currentText()}") chart.setAnimationOptions(QChart.SeriesAnimations) chart_view = QChartView(chart) self.graph_layout.replaceWidget(self.crt_chart, chart_view) self.crt_chart = chart_view axisX = QValueAxis() chart.addAxis(axisX, Qt.AlignBottom) series.attachAxis(axisX) axisX.applyNiceNumbers() chart.legend().setVisible(True) chart.legend().setAlignment(Qt.AlignBottom) chart_view.setRenderHint(QPainter.Antialiasing) chart_view.setBackgroundBrush(QColor(0, 0, 0, 255)) chart.setBackgroundBrush(QColor(255, 255, 0, 255)) # vertical bar elif self.select_chart.currentIndex() == 1: chart = QChart(flags=Qt.WindowFlags()) series = QBarSeries() for i in range(len(x_vals)): name = x_vals[i] set0 = QBarSet(name) set0.append(y_vals[i]) series.append(set0) chart.addSeries(series) if text[:5] == "Inter": chart.setTitle(f"Comparison by {self.select_metric_inter.currentText()}") else: chart.setTitle(f"Comparison by {self.select_metric_intra.currentText()}") chart.setAnimationOptions(QChart.SeriesAnimations) chart_view = QChartView(chart) self.graph_layout.replaceWidget(self.crt_chart, chart_view) self.crt_chart = chart_view axisY = QValueAxis() chart.addAxis(axisY, Qt.AlignLeft) series.attachAxis(axisY) axisY.applyNiceNumbers() chart.legend().setVisible(True) chart.legend().setAlignment(Qt.AlignBottom) chart_view.setRenderHint(QPainter.Antialiasing) chart_view.setBackgroundBrush(QColor(0, 0, 0, 255)) chart.setBackgroundBrush(QColor(255, 255, 0, 255)) # pie chart elif self.select_chart.currentIndex() == 2: chart = QChart(flags=Qt.WindowFlags()) series = QPieSeries() for i in range(len(x_vals)): series.append(x_vals[i], y_vals[i]) chart.addSeries(series) if text[:5] == "Inter": chart.setTitle(f"Comparison by {self.select_metric_inter.currentText()}") else: chart.setTitle(f"Comparison by {self.select_metric_intra.currentText()}") chart.setAnimationOptions(QChart.SeriesAnimations) chart.legend().setAlignment(Qt.AlignBottom) # chart.legend().setFont(QFont("Arial", 12)) chart_view = QChartView(chart) self.graph_layout.replaceWidget(self.crt_chart, chart_view) self.crt_chart = chart_view chart_view.setRenderHint(QPainter.Antialiasing) chart_view.setBackgroundBrush(QColor(0, 0, 0, 255)) chart.setBackgroundBrush(QColor(255, 255, 0, 255)) chart_view.setRubberBand(QChartView.HorizontalRubberBand) chart_view.setRubberBand(QChartView.VerticalRubberBand)
class QtChartCanvas(QWidget): def __init__(self, parent=None): super(QtChartCanvas, self).__init__(parent) self.setStyleSheet("border:0;background-color:#263848") self.plotChart = QChart() self.plotChart.legend().hide() self.verticalLayout = QtWidgets.QVBoxLayout(self) self.plotView = QChartView(self.plotChart) self.plotView.setStyleSheet("border:0;background-color:#263848;") self.plotView.setBackgroundBrush(QBrush(QColor("#263848"))) self.plotChart.setBackgroundBrush(QBrush(QColor("#263848"))) #self.plotChart.setStyle() self.verticalLayout.addWidget(self.plotView) self.plotCurve = QSplineSeries() self.plotCurve.setColor(QColor("#AABFFF")) self.plotCurve.setUseOpenGL(True) self.plotCurve.pen().setColor(QColor("#FAF0FF")) self.plotChart.addSeries(self.plotCurve) # self.scatter=QScatterSeries() # self.scatter.setMarkerSize(8) # self.plotChart.addSeries(self.scatter) self.plotChart.createDefaultAxes() self.plotChart.axisY().setGridLineColor(QColor("#5D5C72")) self.plotChart.axisY().setLinePenColor(QColor("#9D9CA2")) self.plotChart.axisY().setLabelsColor(QColor("#F8F6F6")) self.plotChart.axisY().setRange(0, 100) self.plotChart.axisX().hide() self.RecvData = [] # 存储接收到的传感器数据 self.RecvIndx = 0 self.setLockY = True self.isTop = False self.minY = 0 self.maxY = 100 def update_figure(self, payload): data = payload["data"] self.RecvData.append(data) self.RecvData = self.RecvData[-20:] plotData = [] if self.isTop: for i, val in enumerate(self.RecvData): plotData.append(QPoint(i, val)) self.plotCurve.replace(plotData) #self.scatter.replace(plotData) self.plotChart.axisX().setMax(len(plotData)) if not self.setLockY: self.plotChart.axisY().setRange( min(self.RecvData) * 0.5, max(self.RecvData) * 1.3) else: self.plotChart.axisY().setRange(self.minY, self.maxY) def setYLimit(self, miny=0, maxy=100, lockY=True): self.setLockY = lockY if self.setLockY: self.maxY = maxy self.minY = miny def changeTop(self, isTop): self.isTop = isTop
class graficoBarras(QWidget): def __init__(self, parent=None): super(graficoBarras, self).__init__(parent) self.initUI() def initUI(self): comboBoxColor = QComboBox() comboBoxColor.addItems([ "Color del fondo del CharView", "Color del fondo del Chart", "Color del título del Chart", "Color de las etiquetas del eje X", "Color de las etiquetas del eje Y", "Color de las etiquetas de la leyenda" ]) checkBoxVisibilidadFondoChart = QCheckBox("Visibilidad fondo (chart)") checkBoxMargenesChart = QCheckBox("Margenes del chart") checkBoxEsquinasChart = QCheckBox("Esquinas del chart") buttonGuardar = QPushButton("Guardar gráfico") # Crear gráficos. self.vistaGrafico = QChartView(self.crearGraficoBarras()) self.vistaGrafico.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.vistaGrafico.setRenderHint(QPainter.Antialiasing, True) # ========================== DISEÑO ========================== disenioConfiguracion = QVBoxLayout() disenioConfiguracion.addWidget(QLabel("Cambiar colores:")) disenioConfiguracion.addWidget(comboBoxColor) disenioConfiguracion.addWidget(checkBoxVisibilidadFondoChart) disenioConfiguracion.addWidget(checkBoxMargenesChart) disenioConfiguracion.addWidget(checkBoxEsquinasChart) disenioConfiguracion.setSpacing(4) disenioConfiguracion.addStretch() disenioConfiguracion.addWidget(buttonGuardar) baseDisenio = QGridLayout() baseDisenio.addLayout(disenioConfiguracion, 0, 0, 0, 1) baseDisenio.addWidget(self.vistaGrafico, 0, 1, 0, 4) baseDisenio.setSpacing(10) baseDisenio.setContentsMargins(10, 10, 10, 10) self.setLayout(baseDisenio) # ===================== CONECTAR SEÑALES ===================== comboBoxColor.activated.connect(self.Color) checkBoxVisibilidadFondoChart.toggled.connect( self.visibilidadFondoChart) checkBoxMargenesChart.toggled.connect(self.margenesChart) checkBoxEsquinasChart.toggled.connect(self.esquinasChart) buttonGuardar.clicked.connect(self.Guardar) # Establecer los valores predeterminados comboBoxColor.setCurrentIndex(-1) checkBoxVisibilidadFondoChart.setChecked(True) checkBoxMargenesChart.setChecked(True) checkBoxEsquinasChart.setChecked(True) # ========================== FUNCIONES =========================== def crearGraficoBarras(self): paises = [ "EEUU", "China", "Japon", "Alemania", "Reino Unido", "Resto del mundo" ] valores = [24.32, 14.85, 8.91, 12.54, 7.85, 31.53] colores = [ Qt.blue, Qt.red, Qt.darkYellow, Qt.gray, Qt.black, Qt.darkCyan ] grafico = QChart() grafico.setMargins(QMargins(30, 30, 30, 30)) grafico.setTheme(QChart.ChartThemeLight) grafico.setTitle("% Distribución del PIB global") grafico.setAnimationOptions(QChart.SeriesAnimations) for i in range(len(paises)): series = QBarSeries() barSet = QBarSet(paises[i]) barSet.setColor(colores[i]) barSet.setLabelColor(Qt.yellow) barSet.append(valores[i]) series.append(barSet) series.setLabelsVisible(True) series.setLabelsAngle(-90) # series.setLabelsPrecision(2) series.setLabelsFormat("@value %") series.setLabelsPosition(QAbstractBarSeries.LabelsCenter) grafico.addSeries(series) axisX = QBarCategoryAxis() axisX.append(paises) axisY = QValueAxis() axisY.setRange(0, 31.53) axisY.setTickCount(10) axisY.setLabelFormat("%.2f %") grafico.createDefaultAxes() grafico.setAxisX(axisX, None) grafico.setAxisY(axisY, None) grafico.legend().setVisible(True) grafico.legend().setAlignment(Qt.AlignBottom) return grafico def Color(self, item): if item == 0: color = (self.vistaGrafico.backgroundBrush().color() if self.vistaGrafico.backgroundBrush().color().isValid() else QColor(Qt.white)) elif item == 1: color = ( self.vistaGrafico.chart().backgroundBrush().color() if self.vistaGrafico.chart().backgroundBrush().color().isValid() else QColor(Qt.white)) elif item == 2: color = (self.vistaGrafico.chart().titleBrush().color() if self.vistaGrafico.chart().titleBrush().color().isValid() else QColor(Qt.black)) elif item == 3: color = (self.vistaGrafico.chart().axisX().labelsBrush().color() if self.vistaGrafico.chart().axisX().labelsBrush().color( ).isValid() else QColor(Qt.black)) elif item == 4: color = (self.vistaGrafico.chart().axisY().labelsBrush().color() if self.vistaGrafico.chart().axisY().labelsBrush().color( ).isValid() else QColor(Qt.black)) elif item == 5: color = (self.vistaGrafico.chart().legend().labelColor() if self.vistaGrafico.chart().legend().labelColor().isValid() else QColor(Qt.black)) color = QColorDialog.getColor(color, self) if color.isValid(): if item == 0: self.vistaGrafico.setBackgroundBrush(color) elif item == 1: self.vistaGrafico.chart().setBackgroundBrush(color) elif item == 2: self.vistaGrafico.chart().setTitleBrush(color) elif item == 3: self.vistaGrafico.chart().axisX().setLabelsBrush(color) elif item == 4: self.vistaGrafico.chart().axisY().setLabelsBrush(color) elif item == 5: self.vistaGrafico.chart().legend().setLabelColor(color) def visibilidadFondoChart(self, bool): self.vistaGrafico.chart().setBackgroundVisible(bool) def margenesChart(self, bool): if bool: self.vistaGrafico.chart().layout().setContentsMargins(9, 9, 9, 9) else: self.vistaGrafico.chart().layout().setContentsMargins(0, 0, 0, 0) def esquinasChart(self, bool): if bool: self.vistaGrafico.chart().setBackgroundRoundness(5) else: self.vistaGrafico.chart().setBackgroundRoundness(0) def Guardar(self): nombre, extension = QFileDialog.getSaveFileName( self, "Guardar como", "Gráfico de barras", "JPG (*.jpg);;PNG (*.png)", options=QFileDialog.Options()) if nombre: guardar = QPixmap(self.vistaGrafico.grab()) guardar.save(nombre, quality=100) if guardar: QMessageBox.information(self, "Guardar gráfico", "Gráfico guardado con éxito.", QMessageBox.Ok) else: QMessageBox.critical(self, "Guardar gráfico", "Error al guardar el gráfico.", QMessageBox.Ok)
class TelemetryDialog(QDialog): resized = QtCore.pyqtSignal() visibility = QtCore.pyqtSignal(bool) def __init__(self, winTitle="Network Telemetry", parent=None): super(TelemetryDialog, self).__init__(parent) self.visibility.connect(self.onVisibilityChanged) self.winTitle = winTitle self.updateLock = Lock() # Used to detect network change self.lastNetKey = "" self.lastSeen = None self.maxPoints = 20 self.maxRowPoints = 60 self.paused = False self.streamingSave = False self.streamingFile = None self.linesBeforeFlush = 10 self.currentLine = 0 # OK and Cancel buttons #buttons = QDialogButtonBox(QDialogButtonBox.Ok,Qt.Horizontal, self) #buttons.accepted.connect(self.accept) #buttons.move(170, 280) desktopSize = QApplication.desktop().screenGeometry() #self.mainWidth=1024 #self.mainHeight=768 #self.mainWidth = desktopSize.width() * 3 / 4 #self.mainHeight = desktopSize.height() * 3 / 4 self.setGeometry(self.geometry().x(), self.geometry().y(), desktopSize.width() / 2, desktopSize.height() / 2) self.setWindowTitle(winTitle) self.radar = RadarWidget(self) self.radar.setGeometry(self.geometry().width() / 2, 10, self.geometry().width() / 2 - 20, self.geometry().width() / 2 - 20) self.createTable() self.btnExport = QPushButton("Export Table", self) self.btnExport.clicked[bool].connect(self.onExportClicked) self.btnExport.setStyleSheet("background-color: rgba(2,128,192,255);") self.btnPause = QPushButton("Pause Table", self) self.btnPause.setCheckable(True) self.btnPause.clicked[bool].connect(self.onPauseClicked) self.btnPause.setStyleSheet("background-color: rgba(2,128,192,255);") self.btnStream = QPushButton("Streaming Save", self) self.btnStream.setCheckable(True) self.btnStream.clicked[bool].connect(self.onStreamClicked) self.btnStream.setStyleSheet("background-color: rgba(2,128,192,255);") self.createChart() self.setBlackoutColors() self.setMinimumWidth(600) self.setMinimumHeight(600) self.center() def createTable(self): # Set up location table self.locationTable = QTableWidget(self) self.locationTable.setColumnCount(8) self.locationTable.setGeometry(10, 10, self.geometry().width() / 2 - 20, self.geometry().height() / 2) self.locationTable.setShowGrid(True) self.locationTable.setHorizontalHeaderLabels([ 'macAddr', 'SSID', 'Strength', 'Timestamp', 'GPS', 'Latitude', 'Longitude', 'Altitude' ]) self.locationTable.resizeColumnsToContents() self.locationTable.setRowCount(0) self.locationTable.horizontalHeader().setSectionResizeMode( 1, QHeaderView.Stretch) self.ntRightClickMenu = QMenu(self) newAct = QAction('Copy', self) newAct.setStatusTip('Copy data to clipboard') newAct.triggered.connect(self.onCopy) self.ntRightClickMenu.addAction(newAct) self.locationTable.setContextMenuPolicy(Qt.CustomContextMenu) self.locationTable.customContextMenuRequested.connect( self.showNTContextMenu) def setBlackoutColors(self): self.locationTable.setStyleSheet( "QTableView {background-color: black;gridline-color: white;color: white} QTableCornerButton::section{background-color: white;}" ) headerStyle = "QHeaderView::section{background-color: white;border: 1px solid black;color: black;} QHeaderView::down-arrow,QHeaderView::up-arrow {background: none;}" self.locationTable.horizontalHeader().setStyleSheet(headerStyle) self.locationTable.verticalHeader().setStyleSheet(headerStyle) mainTitleBrush = QBrush(Qt.red) self.timeChart.setTitleBrush(mainTitleBrush) self.timeChart.setBackgroundBrush(QBrush(Qt.black)) self.timeChart.axisX().setLabelsColor(Qt.white) self.timeChart.axisY().setLabelsColor(Qt.white) titleBrush = QBrush(Qt.white) self.timeChart.axisX().setTitleBrush(titleBrush) self.timeChart.axisY().setTitleBrush(titleBrush) def resizeEvent(self, event): wDim = self.geometry().width() / 2 - 20 hDim = self.geometry().height() / 2 smallerDim = wDim if hDim < smallerDim: smallerDim = hDim # Radar self.radar.setGeometry(self.geometry().width() - smallerDim - 10, 10, smallerDim, smallerDim) # chart self.timePlot.setGeometry(10, 10, self.geometry().width() - smallerDim - 30, smallerDim) # Buttons self.btnPause.setGeometry(10, self.geometry().height() / 2 + 18, 110, 25) self.btnExport.setGeometry(150, self.geometry().height() / 2 + 18, 110, 25) self.btnStream.setGeometry(290, self.geometry().height() / 2 + 18, 110, 25) # Table self.locationTable.setGeometry(10, self.geometry().height() / 2 + 50, self.geometry().width() - 20, self.geometry().height() / 2 - 60) def center(self): # Get our geometry qr = self.frameGeometry() # Find the desktop center point cp = QDesktopWidget().availableGeometry().center() # Move our center point to the desktop center point qr.moveCenter(cp) # Move the top-left point of the application window to the top-left point of the qr rectangle, # basically centering the window self.move(qr.topLeft()) def showNTContextMenu(self, pos): curRow = self.locationTable.currentRow() if curRow == -1: return self.ntRightClickMenu.exec_(self.locationTable.mapToGlobal(pos)) def onCopy(self): self.updateLock.acquire() curRow = self.locationTable.currentRow() curCol = self.locationTable.currentColumn() if curRow == -1 or curCol == -1: self.updateLock.release() return curText = self.locationTable.item(curRow, curCol).text() clipboard = QApplication.clipboard() clipboard.setText(curText) self.updateLock.release() def onVisibilityChanged(self, visible): if not visible: self.paused = True self.btnPause.setStyleSheet("background-color: rgba(255,0,0,255);") # We're coming out of streaming self.streamingSave = False self.btnStream.setStyleSheet( "background-color: rgba(2,128,192,255);") self.btnStream.setChecked(False) if (self.streamingFile): self.streamingFile.close() self.streamingFile = None return else: self.paused = False self.btnPause.setStyleSheet( "background-color: rgba(2,128,192,255);") if self.locationTable.rowCount() > 1: self.locationTable.scrollToItem(self.locationTable.item(0, 0)) def hideEvent(self, event): self.visibility.emit(False) def showEvent(self, event): self.visibility.emit(True) def onPauseClicked(self, pressed): if self.btnPause.isChecked(): self.paused = True self.btnPause.setStyleSheet("background-color: rgba(255,0,0,255);") else: self.paused = False self.btnPause.setStyleSheet( "background-color: rgba(2,128,192,255);") def onStreamClicked(self, pressed): if not self.btnStream.isChecked(): # We're coming out of streaming self.streamingSave = False self.btnStream.setStyleSheet( "background-color: rgba(2,128,192,255);") if (self.streamingFile): self.streamingFile.close() self.streamingFile = None return self.btnStream.setStyleSheet("background-color: rgba(255,0,0,255);") self.streamingSave = True fileName = self.saveFileDialog() if not fileName: self.btnStream.setStyleSheet( "background-color: rgba(2,128,192,255);") self.btnStream.setChecked(False) return try: self.streamingFile = open( fileName, 'w', 1 ) # 1 says use line buffering, otherwise it fully buffers and doesn't write except: QMessageBox.question(self, 'Error', "Unable to write to " + fileName, QMessageBox.Ok) self.streamingFile = None self.streamingSave = False self.btnStream.setStyleSheet( "background-color: rgba(2,128,192,255);") self.btnStream.setChecked(False) return self.streamingFile.write( 'MAC Address,SSID,Strength,Timestamp,GPS,Latitude,Longitude,Altitude\n' ) def onExportClicked(self): fileName = self.saveFileDialog() if not fileName: return try: outputFile = open(fileName, 'w') except: QMessageBox.question(self, 'Error', "Unable to write to " + fileName, QMessageBox.Ok) return outputFile.write( 'MAC Address,SSID,Strength,Timestamp,GPS,Latitude,Longitude,Altitude\n' ) numItems = self.locationTable.rowCount() if numItems == 0: outputFile.close() return self.updateLock.acquire() for i in range(0, numItems): outputFile.write( self.locationTable.item(i, 0).text() + ',"' + self.locationTable.item(i, 1).text() + '",' + self.locationTable.item(i, 2).text() + ',' + self.locationTable.item(i, 3).text()) outputFile.write(',' + self.locationTable.item(i, 4).text() + ',' + self.locationTable.item(i, 5).text() + ',' + self.locationTable.item(i, 6).text() + ',' + self.locationTable.item(i, 7).text() + '\n') self.updateLock.release() outputFile.close() def saveFileDialog(self): options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getSaveFileName( self, "QFileDialog.getSaveFileName()", "", "CSV Files (*.csv);;All Files (*)", options=options) if fileName: return fileName else: return None def createChart(self): self.timeChart = QChart() titleFont = QFont() titleFont.setPixelSize(18) titleBrush = QBrush(QColor(0, 0, 255)) self.timeChart.setTitleFont(titleFont) self.timeChart.setTitleBrush(titleBrush) self.timeChart.setTitle('Signal (Past ' + str(self.maxPoints) + ' Samples)') # self.timeChart.addSeries(testseries) # self.timeChart.createDefaultAxes() self.timeChart.legend().hide() # Axis examples: https://doc.qt.io/qt-5/qtcharts-multiaxis-example.html newAxis = QValueAxis() newAxis.setMin(0) newAxis.setMax(self.maxPoints) newAxis.setTickCount(11) newAxis.setLabelFormat("%d") newAxis.setTitleText("Sample") self.timeChart.addAxis(newAxis, Qt.AlignBottom) newAxis = QValueAxis() newAxis.setMin(-100) newAxis.setMax(-10) newAxis.setTickCount(9) newAxis.setLabelFormat("%d") newAxis.setTitleText("dBm") self.timeChart.addAxis(newAxis, Qt.AlignLeft) chartBorder = Qt.darkGray self.timePlot = QChartView(self.timeChart, self) self.timePlot.setBackgroundBrush(chartBorder) self.timePlot.setRenderHint(QPainter.Antialiasing) self.timeSeries = QLineSeries() pen = QPen(Qt.yellow) pen.setWidth(2) self.timeSeries.setPen(pen) self.timeChart.addSeries(self.timeSeries) self.timeSeries.attachAxis(self.timeChart.axisX()) self.timeSeries.attachAxis(self.timeChart.axisY()) def updateNetworkData(self, curNet): if not self.isVisible(): return # Signal is -NN dBm. Need to make it positive for the plot self.radar.updateData(curNet.signal * -1) if self.winTitle == "Client Telemetry": self.setWindowTitle(self.winTitle + " - [" + curNet.macAddr + "] " + curNet.ssid) else: self.setWindowTitle(self.winTitle + " - " + curNet.ssid) self.radar.draw() # Network changed. Clear our table and time data updateChartAndTable = False self.updateLock.acquire() if (curNet.getKey() != self.lastNetKey): self.lastNetKey = curNet.getKey() self.locationTable.setRowCount(0) self.timeSeries.clear() updateChartAndTable = True ssidTitle = curNet.ssid if len(ssidTitle) > 28: ssidTitle = ssidTitle[:28] ssidTitle = ssidTitle + '...' self.timeChart.setTitle(ssidTitle + ' Signal (Past ' + str(self.maxPoints) + ' Samples)') else: if self.lastSeen != curNet.lastSeen: updateChartAndTable = True if updateChartAndTable: # Update chart numPoints = len(self.timeSeries.pointsVector()) if numPoints >= self.maxPoints: self.timeSeries.remove(0) # Now we need to reset the x data to pull the series back counter = 0 for curPoint in self.timeSeries.pointsVector(): self.timeSeries.replace(counter, counter, curPoint.y()) counter += 1 if curNet.signal >= -100: self.timeSeries.append(numPoints, curNet.signal) else: self.timeSeries.append(numPoints, -100) # Update Table self.addTableData(curNet) # Limit points in each if self.locationTable.rowCount() > self.maxRowPoints: self.locationTable.setRowCount(self.maxRowPoints) self.updateLock.release() def addTableData(self, curNet): if self.paused: return # rowPosition = self.locationTable.rowCount() # Always insert at row(0) rowPosition = 0 self.locationTable.insertRow(rowPosition) #if (addedFirstRow): # self.locationTable.setRowCount(1) # ['macAddr','SSID', 'Strength', 'Timestamp','GPS', 'Latitude', 'Longitude', 'Altitude'] self.locationTable.setItem(rowPosition, 0, QTableWidgetItem(curNet.macAddr)) tmpssid = curNet.ssid if (len(tmpssid) == 0): tmpssid = '<Unknown>' newSSID = QTableWidgetItem(tmpssid) self.locationTable.setItem(rowPosition, 1, newSSID) self.locationTable.setItem(rowPosition, 2, IntTableWidgetItem(str(curNet.signal))) self.locationTable.setItem( rowPosition, 3, DateTableWidgetItem(curNet.lastSeen.strftime("%m/%d/%Y %H:%M:%S"))) if curNet.gps.isValid: self.locationTable.setItem(rowPosition, 4, QTableWidgetItem('Yes')) else: self.locationTable.setItem(rowPosition, 4, QTableWidgetItem('No')) self.locationTable.setItem( rowPosition, 5, FloatTableWidgetItem(str(curNet.gps.latitude))) self.locationTable.setItem( rowPosition, 6, FloatTableWidgetItem(str(curNet.gps.longitude))) self.locationTable.setItem( rowPosition, 7, FloatTableWidgetItem(str(curNet.gps.altitude))) #order = Qt.DescendingOrder #self.locationTable.sortItems(3, order ) # If we're in streaming mode, write the data out to disk as well if self.streamingFile: self.streamingFile.write( self.locationTable.item(rowPosition, 0).text() + ',"' + self.locationTable.item(rowPosition, 1).text() + '",' + self.locationTable.item(rowPosition, 2).text() + ',' + self.locationTable.item(rowPosition, 3).text() + ',' + self.locationTable.item(rowPosition, 4).text() + ',' + self.locationTable.item(rowPosition, 5).text() + ',' + self.locationTable.item(rowPosition, 6).text() + ',' + self.locationTable.item(rowPosition, 7).text() + '\n') if (self.currentLine > self.linesBeforeFlush): self.streamingFile.flush() self.currentLine += 1 numRows = self.locationTable.rowCount() if numRows > 1: self.locationTable.scrollToItem(self.locationTable.item(0, 0)) def onTableHeadingClicked(self, logical_index): header = self.locationTable.horizontalHeader() order = Qt.DescendingOrder # order = Qt.DescendingOrder if not header.isSortIndicatorShown(): header.setSortIndicatorShown(True) elif header.sortIndicatorSection() == logical_index: # apparently, the sort order on the header is already switched # when the section was clicked, so there is no need to reverse it order = header.sortIndicatorOrder() header.setSortIndicator(logical_index, order) self.locationTable.sortItems(logical_index, order) def updateData(self, newRadius): self.radar.updateData(newRadius) def showTelemetry(parent=None): dialog = TelemetryDialog(parent) result = dialog.exec_() return (result == QDialog.Accepted)
class Example(QMainWindow): def __init__(self, ): super().__init__() self.bijiao = [0, 0, 0] self.res = "" self.queue = [] self.k = -1 self.flag = -1 try: self.initUI() self.chart_init(10) except: traceback.print_exc() def initUI(self): icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap("D:\\Sysytem\\Desktop\\zhong\\data\\ico.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.setWindowIcon(icon) self.resize(1000, 700) self.setWindowTitle('Icon') self.setObjectName("清华大学得不到的学生") self.setWindowTitle("一枚小乖乖~") self.label = QLabel(self) self.label.setWindowTitle("清华大学得不到的学生") self.setWindowFlags(Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) self.label.setGeometry(QtCore.QRect(15, 15, 970, self.height() - 30)) self.label.setText("") palette = QtGui.QPalette() self.label.setStyleSheet("background-color: #fff;border-radius: 15px;") self.labelshadow = QGraphicsDropShadowEffect(self) self.labelshadow.setBlurRadius(15) self.labelshadow.setOffset(1, 1) self.label.setGraphicsEffect(self.labelshadow) self.label.setScaledContents(True) self.label.setObjectName("label") self.pushButton_12 = QtWidgets.QPushButton(self) self.pushButton_12.setGeometry( QtCore.QRect(self.width() - 55, 29, 20, 20)) self.pushButton_12.setStyleSheet( "QPushButton{\n" " background:#fc625d;\n" " color:white;\n" " box-shadow: 1px 1px 3px rgba(0,0,0,0.3);font-size:20px;border-radius: 10px;font-family: 微软雅黑;\n" "}\n" "QPushButton:hover{ \n" " background:#FF2D2D;\n" "}\n" "QPushButton:pressed{\n" " border: 1px solid #3C3C3C!important;\n" " background:#AE0000;\n" "}") self.pushButton_12.clicked.connect(self.close) self.pushButton_14 = QtWidgets.QPushButton(self) self.pushButton_14.setGeometry( QtCore.QRect(self.width() - 55 - 35, 29, 20, 20)) self.pushButton_14.setStyleSheet( "QPushButton{\n" " background:#35cd4b;\n" " color:white;\n" " box-shadow: 1px 1px 3px rgba(0,0,0,0.3);font-size:20px;border-radius: 10px;font-family: 微软雅黑;\n" "}\n" "QPushButton:hover{ \n" " background:#00CC00;\n" "}\n" "QPushButton:pressed{\n" " border: 1px solid #3C3C3C!important;\n" " background:#009900;\n" "}") self.pushButton_14.clicked.connect(self.showMinimized) self.color = ["#e89291", "#c4b98b", "#81a8e1", "#8cc9c4", "#83bde2"] # -----------------------------------------------------------------测试数量------------------------ error = QtWidgets.QLineEdit(self) error.setGeometry(QtCore.QRect(70, 70, 150, 50)) error.setStyleSheet( "text-align: center;background-color: " + self.color[0] + ";border-radius: 7px;border: 0px solid #000;color:#ffffff;font-size:20px;font-family: 微软雅黑;" ) errorshadow = QGraphicsDropShadowEffect(self) error.setPlaceholderText("测试数量") errorshadow.setBlurRadius(30) cl = QColor("#cacaca") errorshadow.setColor(cl) error.setAlignment(Qt.AlignCenter) errorshadow.setOffset(0, 0) error.textChanged.connect(self.set_suliang) # error.setGraphicsEffect(errorshadow) # -----------------------------------------------------------------随机范围------------------------ fan = QtWidgets.QLineEdit(self) fan.setGeometry(QtCore.QRect(240, 70, 150, 50)) fan.setStyleSheet( "text-align: center;background-color: " + self.color[2] + ";border-radius: 7px;border: 0px solid #000;color:#ffffff;font-size:20px;font-family: 微软雅黑;" ) fanshadow = QGraphicsDropShadowEffect(self) fanshadow.setBlurRadius(30) fancl = QColor("#cacaca") fan.setPlaceholderText("随机范围") fanshadow.setColor(fancl) fan.setAlignment(Qt.AlignCenter) fanshadow.setOffset(0, 0) fan.textChanged.connect(self.set_fanwei) # fan.setGraphicsEffect(fanshadow) # -----------------------------------------------------------------内存块数----------------------- kuai = QtWidgets.QLineEdit(self) kuai.setGeometry(QtCore.QRect(410, 70, 150, 50)) kuai.setStyleSheet( "text-align: center;background-color: " + self.color[3] + ";border-radius: 7px;border: 0px solid #000;color:#ffffff;font-size:20px;font-family: 微软雅黑;" ) kuaishadow = QGraphicsDropShadowEffect(self) kuaishadow.setBlurRadius(30) kuaicl = QColor("#cacaca") kuai.setPlaceholderText("内存块数") kuaishadow.setColor(kuaicl) kuai.setAlignment(Qt.AlignCenter) kuaishadow.setOffset(0, 0) kuai.textChanged.connect(self.set_kuai) # kuai.setGraphicsEffect(kuaishadow) self.Button = QtWidgets.QPushButton(self) self.Button.setGeometry(QtCore.QRect(580, 70, 150, 50)) self.Button.setStyleSheet( "QPushButton{text-align: center;background-color: #83bde2;" "border-radius: 7px;border: 0px solid #000;color:#ffffff;" "font-size:20px;font-family: 微软雅黑;}" + "QPushButton:hover{ " + " background-color: #9ad0d0;color: white;" + "}") Buttonshadow = QGraphicsDropShadowEffect(self) Buttonshadow.setBlurRadius(30) Buttoncl = QColor("#cacaca") self.Button.setText("执行") Buttonshadow.setColor(Buttoncl) Buttonshadow.setOffset(0, 0) # Button.setGraphicsEffect(Buttonshadow) self.Button.clicked.connect(self.on_click_start) self.avgflag = 0 self.qq = QtWidgets.QPushButton(self) self.qq.setGeometry(QtCore.QRect(750, 70, 180, 50)) self.qq.setStyleSheet( "color: #000;text-align: center;background-color: #f0f0f0;border-radius: 7px;border: 0px solid #000;font-size:14px;font-family: 微软雅黑;" ) self.qq.clicked.connect(self.on_avg) self.show() def on_avg(self): if self.avgflag == 0: self.series.hide() self.serieslru.hide() self.seriesopt.hide() self.seriesfifoavg.show() self.serieslruavg.show() self.seriesoptavg.show() self.avgflag = 1 else: self.series.show() self.serieslru.show() self.seriesopt.show() self.seriesfifoavg.hide() self.serieslruavg.hide() self.seriesoptavg.hide() self.avgflag = 0 def set_kuai(self, text): self.kuai = text def set_fanwei(self, text): self.fan = text def set_suliang(self, text): self.su = text def hideerror(self): self.error.hide() def set_kuaishu(self, text): self.kuaishu = text def set_yemian(self, text): self.yemian = text def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate def mousePressEvent(self, e): if e.button() == Qt.LeftButton: self.m_drag = True self.m_DragPosition = e.globalPos() - self.pos() e.accept() def mouseReleaseEvent(self, e): if e.button() == Qt.LeftButton: self.m_drag = False def mouseMoveEvent(self, e): try: if Qt.LeftButton and self.m_drag: self.move(e.globalPos() - self.m_DragPosition) e.accept() except: print("错误代码:000x0") def on_click_start(self): try: self.jishu = 0 self.thread = MyThread() self.thread.set_su(self.su) self.thread.set_kuai(self.kuai) self.thread.set_x(self.dtaxisX) self.thread.set_fan(self.fan) self.thread.det_bijiao(self.bijiao) self.dailist = [] self.avg = [] self.avg1 = [] self.avg2 = [] self.dailistlru = [] self.dailistopt = [] self.thread.sinOut.connect(self.change) self.thread.start() # self.qq.setText("FIFO:%0.2f LRU:%0.2f \n OPT:%0.2f" % (self.bijiao[0], self.bijiao[1], self.bijiao[2])) except: traceback.print_exc() # self.sinOut.emit(self.dailist) # self.sinOut2.emit(self.dailistlru) # self.sinOut3.emit(self.dailistopt) def change(self, dailist): try: # print(dailist) # arr = str.split(dailist) # print(arr) flag = 0 start = 0 flag = dailist.find(" ", flag) flag = dailist.find(" ", flag + 1) end = flag arr = str.split(dailist[start:end]) start = flag flag = dailist.find(" ", flag + 1) flag = dailist.find(" ", flag + 1) end = flag arr1 = str.split(dailist[start:end]) start = flag flag = dailist.find(" ", flag + 1) flag = dailist.find(" ", flag + 1) end = flag arr2 = str.split(dailist[start:end]) self.dailist.append(QPointF(float(arr[0]), float(arr[1]))) self.dailistlru.append(QPointF(float(arr1[0]), float(arr1[1]))) self.dailistopt.append(QPointF(float(arr2[0]), float(arr2[1]))) # self.series.replace(self.dailist) self.serieslru.replace(self.dailistlru) self.seriesopt.replace(self.dailistopt) if self.jishu == 0: self.bijiao[0] = float(arr[1]) self.bijiao[1] = float(arr1[1]) self.bijiao[2] = float(arr2[1]) self.jishu = 1 else: self.bijiao[0] = (float(arr[1]) + self.bijiao[0]) / 2.0 self.bijiao[1] = (float(arr1[1]) + self.bijiao[1]) / 2.0 self.bijiao[2] = (float(arr2[1]) + self.bijiao[2]) / 2.0 self.jishu = self.jishu + 1 self.avg.append(QPointF(float(arr[0]), self.bijiao[0])) self.avg1.append(QPointF(float(arr[0]), self.bijiao[1])) self.avg2.append(QPointF(float(arr[0]), self.bijiao[2])) # print(self.avg) self.seriesfifoavg.replace(self.avg) self.serieslruavg.replace(self.avg1) self.seriesoptavg.replace(self.avg2) self.qq.setText("FIFO:%0.2f LRU:%0.2f \n OPT:%0.2f" % (self.bijiao[0], self.bijiao[1], self.bijiao[2])) except: traceback.print_exc() def drawLine(self): self.series.replace(self.dailist) # print("uiy") def chart_init(self, su): self.start_num = 0 self.chart = QChartView(self) self.chart.setGeometry(50, 150, self.width() - 100, self.height() - 150 - 50) # 设置charView位置、大小 self.series = QSplineSeries() self.series.setName("FIFO") self.chart.chart().addSeries(self.series) pen = QPen(Qt.gray) pen.setWidth(2) self.serieslru = QSplineSeries() self.serieslru.setPen(pen) self.serieslru.setName("LRU") self.serieslru.setColor(QColor("#e89291")) self.chart.chart().addSeries(self.serieslru) pen2 = QPen(Qt.gray) pen2.setWidth(2) self.seriesopt = QSplineSeries() self.seriesopt.setPen(pen2) self.seriesopt.setColor(QColor("#3ea54f")) self.seriesopt.setName("OPT") self.chart.chart().addSeries(self.seriesopt) penfifo = QPen(Qt.gray) penfifo.setWidth(2) self.seriesfifoavg = QSplineSeries() self.seriesfifoavg.setPen(penfifo) self.seriesfifoavg.setName("FIFO-avg") self.seriesfifoavg.setColor(QColor("#209fdf")) self.chart.chart().addSeries(self.seriesfifoavg) self.seriesfifoavg.hide() penavg = QPen(Qt.gray) penavg.setWidth(2) self.serieslruavg = QSplineSeries() self.serieslruavg.setPen(penavg) self.serieslruavg.setName("LRU-avg") self.serieslruavg.setColor(QColor("#e89291")) self.chart.chart().addSeries(self.serieslruavg) self.serieslruavg.hide() pen2avg = QPen(Qt.gray) pen2avg.setWidth(2) self.seriesoptavg = QSplineSeries() self.seriesoptavg.setPen(pen2avg) self.seriesoptavg.setColor(QColor("#3ea54f")) self.seriesoptavg.setName("OPT-avg") self.chart.chart().addSeries(self.seriesoptavg) self.seriesoptavg.hide() self.dtaxisX = QValueAxis() self.vlaxisY = QValueAxis() self.dtaxisX.setMin(10) self.dtaxisX.setMax(100) self.vlaxisY.setMin(0) self.vlaxisY.setMax(100) self.dtaxisX.setTickCount(6) self.vlaxisY.setTickCount(11) self.dtaxisX.setTitleText("页数") self.vlaxisY.setTitleText("缺页率") self.vlaxisY.setGridLineVisible(False) self.chart.chart().addAxis(self.dtaxisX, Qt.AlignBottom) self.chart.chart().addAxis(self.vlaxisY, Qt.AlignLeft) self.series.attachAxis(self.dtaxisX) self.series.attachAxis(self.vlaxisY) self.serieslru.attachAxis(self.dtaxisX) self.serieslru.attachAxis(self.vlaxisY) self.seriesopt.attachAxis(self.dtaxisX) self.seriesopt.attachAxis(self.vlaxisY) self.seriesoptavg.attachAxis(self.dtaxisX) self.seriesoptavg.attachAxis(self.vlaxisY) self.serieslruavg.attachAxis(self.dtaxisX) self.serieslruavg.attachAxis(self.vlaxisY) self.seriesfifoavg.attachAxis(self.dtaxisX) self.seriesfifoavg.attachAxis(self.vlaxisY) self.chart.chart().setTitleBrush(QBrush(Qt.cyan)) cc = QColor("#f0f0f0") self.chart.setBackgroundBrush(cc) self.chart.setStyleSheet( "QChartView{ background-color: #83bde2;border-radius: 20px;}") self.chart.show()