【发布时间】:2021-03-31 08:53:56
【问题描述】:
我正在尝试创建一个使用 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_())
【问题讨论】:
-
96 个按钮?这对于 UI 来说已经很多了。
-
@JHBonarius 在这个特定的 UI 中,我试图绘制一些细胞的生长曲线。生长测定通常在 96 孔板中进行,能够检查单个生长曲线会很好。在稍后阶段,我将尝试添加可以通过选择一组按钮上方的区域来选择一组按钮的功能,以使绘图更容易。总的来说,我想知道我实现代码的方式是否有效。由于我没有制作 GUI 的经验,我不确定为每个按钮使用几乎相同的代码是否正确。