Я пытаюсь написать синтаксический анализатор с основным графическим интерфейсом (Qwidget), используя средство выбора файлов, чтобы выбрать текстовый файл для анализа.
Он открывает другой Qwidget как всплывающее окно для выполнения некоторых типов анализа.
Это все работает прямо сейчас.И я хочу добавить некоторые дополнительные функции, анализируя данные и отображая их с помощью matplotlib.
У меня возникли проблемы с использованием примера контрольной кнопки matplotlib для реализации интерактивного встроенного графа с pyqt5.В моем коде это класс PopUpUsageGraphs.График работает, но я не вижу флажок.Моя главная задача - скрыть и показать линии на моем графике.Я также хорошо использую пример выбора легенды, но он также не работает с моей реализацией pyqt5.
Пример CheckButton
Пример выбора легенды
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from cmsparser import CMSParser
import sip
import sys
import logging
import re
import itertools
from collections import OrderedDict
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.widgets import CheckButtons
# Helper class to display the parsed USAGE Graphs
class PopUpUsageGraphs(QWidget):
def __init__(self, servername, file):
super(PopUpUsageGraphs, self).__init__()
# Get Logger as a global for class
self.logger = logging.getLogger('App')
#Window Property
self.title = 'USAGE Graphs - ' + str(servername)
self.left = 300
self.top = 250
self.width = 1280
self.height = 720
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
self.file = file
self.mainLayout = QVBoxLayout()
self.test = PlotCanvas1(self, width=7, height=4)
self.toolbar = NavigationToolbar(self.test, self)
self.mainLayout.addWidget(self.toolbar)
self.mainLayout.addWidget(self.test)
self.setLayout(self.mainLayout)
class PlotCanvas1(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
FigureCanvas.__init__(self, fig)
self.setParent(parent)
FigureCanvas.setSizePolicy(self,
QSizePolicy.Expanding,
QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
self.plot()
fig.tight_layout()
def plot(self):
t = np.arange(0.0, 2.0, 0.01)
s0 = np.sin(2 * np.pi * t)
s1 = np.sin(4 * np.pi * t)
s2 = np.sin(6 * np.pi * t)
ax = self.figure.add_subplot(111)
l0, = ax.plot(t, s0, visible=False, lw=2)
l1, = ax.plot(t, s1, lw=2)
l2, = ax.plot(t, s2, lw=2)
fig.subplots_adjust(left=0.2)
rax = self.axes([0.05, 0.4, 0.1, 0.15])
check = CheckButtons(rax, ('2 Hz', '4 Hz', '6 Hz'), (False, True, True))
self.axes.set_xlabel('Time')
self.axes.set_ylabel('my ydata')
ax.set_title('PyQt Matplotlib Example')
def func(label):
if label == '2 Hz':
l0.set_visible(not l0.get_visible())
elif label == '4 Hz':
l1.set_visible(not l1.get_visible())
elif label == '6 Hz':
l2.set_visible(not l2.get_visible())
self.draw()
check.on_clicked(func)
self.draw()
class App(QWidget):
def __init__(self):
super().__init__()
#Main Window Property
self.title = 'CMSParser - kedang@cisco.com'
self.left = 100
self.top = 100
self.width = 650
self.height = 400
#Globals
self.file = ""
self.filepath = QLineEdit()
self.sessionoutput = QListWidget()
self.browse_btn = QPushButton('Browse...')
self.parse_btn = QPushButton('Parse...')
self.popups = []
self.usageGraphing = False
self.initUI()
#Get Logger as a global for class
self.logger = logging.getLogger('App')
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
self.sessionoutput.show()
self.show()
#Main Layout
fileinput = QGroupBox("File Input")
top_layout = QFormLayout()
top_layout.addRow(self.browse_btn, self.filepath)
fileinput.setLayout(top_layout)
parseroutput = QGroupBox("Session")
output_layout = QVBoxLayout()
output_layout.addWidget(self.sessionoutput)
parseroutput.setLayout(output_layout)
logger = QCheckBox('Enable Logging', self)
logger.stateChanged.connect(self.log)
usageGraph = QCheckBox('USAGE Graph', self)
usageGraph.stateChanged.connect(self.usageGraphState)
parserinput = QGroupBox("Start")
bot_layout = QHBoxLayout()
bot_layout.addWidget(self.parse_btn)
bot_layout.addWidget(logger)
bot_layout.addWidget(usageGraph)
bot_layout.addStretch(1)
parserinput.setLayout(bot_layout)
mainLayout = QVBoxLayout()
mainLayout.addWidget(fileinput)
mainLayout.addWidget(parseroutput)
mainLayout.addWidget(parserinput)
self.setLayout(mainLayout)
#Connections
self.browse_btn.clicked.connect(self.filePicker)
self.parse_btn.clicked.connect(self.parse)
self.parse_btn.setEnabled(False)
# QFileDialog to get filename assign to global and update the GUI
# Enable the Parse Button
def filePicker(self):
fname = QFileDialog.getOpenFileName(self, 'Open file', '')
self.parse_btn.setEnabled(True)
if fname[0]:
self.filepath.setText(fname[0])
self.file = fname[0]
# Main parse function that takes file name and instantiate DBParser object
# Call getData for parsed tablename, fields and rows
# Call PopUp to instantiate a PopUp window to display parsed data
def parse(self):
if self.file:
self.logger.info('File Loaded: ' + str(self.file))
self.sessionoutput.addItem('Working on file: \"' + str(self.file) + '\" ...')
try:
parser = CMSParser(self.file)
if parser.isDB():
tablename = parser.getTableName()
#Required to instantiate multiple PopUp objects, saved to global list popups
popup = PopUpTable(tablename, self.file)
popup.setAttribute(Qt.WA_DeleteOnClose)
popup.show()
self.popups.append(popup)
self.sessionoutput.addItem('Processed as CMS Database File..')
self.sessionoutput.addItem('Finished parsing database table: ' + str(tablename))
self.logger.info('Processed as CMS Database File')
self.logger.info('Finished parsing data and instantiating popup to display table: ' + str(tablename))
elif parser.isSyslog():
servername = parser.getServerName()
if self.usageGraphing:
popup = PopUpUsageGraphs(servername, self.file)
popup.setAttribute(Qt.WA_DeleteOnClose)
popup.show()
self.popups.append(popup)
self.sessionoutput.addItem('Processed file as CMS Syslog with USAGE Graphing option..')
self.sessionoutput.addItem('Server: ' + str(servername))
self.logger.info('Processed file as CMS Syslog with USAGE Graphing option')
self.logger.info(
'Finished parsing data and instantiating popup to display USAGE data for Server: ' + str(
servername))
else:
# Required to instantiate multiple PopUp objects, saved to global list popups
popup = PopUpText(servername, self.file)
popup.setAttribute(Qt.WA_DeleteOnClose)
popup.show()
self.popups.append(popup)
self.sessionoutput.addItem('Processed file as CMS Syslog..')
self.sessionoutput.addItem('Server: ' + str(servername))
self.logger.info('Processed file as CMS Syslog')
self.logger.info('Finished parsing data and instantiating popup to display data for Server: ' + str(servername))
else:
self.sessionoutput.addItem('Not a parsable file..')
QMessageBox.warning(self, 'Warning', '\nNot a parsable file')
except:
self.sessionoutput.addItem('Invalid file..')
QMessageBox.critical(self, 'Error', "\nInvalid file")
self.parse_btn.setEnabled(False)