Я пытаюсь создать пользовательский интерфейс, используя PyQt5 и pyqtgraph. Я сделал два флажка, и всякий раз, когда я их выбираю, я хочу построить один из двух наборов данных, доступных в коде, и всякий раз, когда я отменяю выбор кнопки, я хочу, чтобы она очищала соответствующую кривую. Есть два флажка с текстами A1
и A2
, и каждый из них отображает один набор данных.
У меня есть две проблемы:
1- Если я выбираю A1
, он отображает данные, связанные с A1
, и пока я не выбираю A2
, отменив выбор A1
, я могу очистить данные, связанные с A1
. Однако, если я отмечу поле A1
, а затем отмечу поле A2
, то отмена выбора A1
не очистит связанный график. В этой ситуации, если я решу построить случайные данные вместо детерминированной кривой, такой как sin
, я увижу, что при выборе любой кнопки добавляются новые данные, но их нельзя удалить.
2- Реальное приложение имеет 96 кнопок, каждая из которых должна быть связана с одним набором данных. Я думаю, что то, как я написал код, неэффективно, потому что мне нужно скопировать один и тот же код для одной кнопки и набора данных 96 раз. Есть ли способ обобщить игрушечный код, который я представил ниже, на произвольное количество флажков? Или, возможно, использование/копирование почти одного и того же кода для каждой кнопки является обычным и правильным способом сделать это?
Код:
from PyQt5 import QtWidgets, uic, QtGui
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
import numpy as np
import sys
import string
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore
app = QtWidgets.QApplication(sys.argv)
x = np.linspace(0, 3.14, 100)
y1 = np.sin(x)#Data number 1 associated to checkbox A1
y2 = np.cos(x)#Data number 2 associated to checkbox A2
#This function is called whenever the state of checkboxes changes
def todo():
if cbx1.isChecked():
global curve1
curve1 = plot.plot(x, y1, pen = 'r')
else:
try:
plot.removeItem(curve1)
except NameError:
pass
if cbx2.isChecked():
global curve2
curve2 = plot.plot(x, y2, pen = 'y')
else:
try:
plot.removeItem(curve2)
except NameError:
pass
#A widget to hold all of my future widgets
widget_holder = QtGui.QWidget()
#Checkboxes named A1 and A2
cbx1 = QtWidgets.QCheckBox()
cbx1.setText('A1')
cbx1.stateChanged.connect(todo)
cbx2 = QtWidgets.QCheckBox()
cbx2.setText('A2')
cbx2.stateChanged.connect(todo)
#Making a pyqtgraph plot widget
plot = pg.PlotWidget()
#Setting the layout
layout = QtGui.QGridLayout()
widget_holder.setLayout(layout)
#Adding the widgets to the layout
layout.addWidget(cbx1, 0,0)
layout.addWidget(cbx2, 0, 1)
layout.addWidget(plot, 1,0, 3,1)
widget_holder.adjustSize()
widget_holder.show()
sys.exit(app.exec_())