如何解决是否可以将“type”类型的变量传递给 ComboBox,以便集合的所有元素都可以选择?
我正在尝试创建一个 GUI 应用程序,让我可以针对任何其他变量绘制任何变量。这是我的第一个 GUI 应用程序,所以也许我咬得比我能咀嚼的多。这些变量的值在数组中,我将它们分组到集合中——也就是说,我使用 collections.nametuple 对原始值、计算的幅度和相位、峰值索引和归一化值进行分组(如果例如,我没有使用正确的术语)。
我想要做的是将所有这些变量(或各种集合的元素(?)作为两个组合框、xdata 和 ydata 中的选择),以便我可以针对任何其他变量绘制任何变量。这是否甚至可能吗?这是我正在尝试创建的应用程序的 MainWindow:
我可以选择文件和解析数据,例如,假设我从文件中的数据创建了这两个集合:
type_aData = collections.namedtuple('type_aData','A_RX '
'A_RXlogmag '
'A_RXmag'
'A_RXph'
'A_pkMagInd'
'A_RXlogmag_N'
'A_RXmag_N'
'A_RX_N'
'A_RXph_N')
type_distance = collections.namedtuple('type_distance','A'
'B')
每个 A_x 都是一个数组,距离 A 和距离 B 也是如此。我想做这样的事情:
self.xdata.addItem(type_distance)
self.ydata.addItem(type_adata)
这样所有的距离变量和 aData 变量都暴露在 x 和 y 数据组合框中,但它抱怨参数不能是“type”类型。如果我改为使用 'type_distance',例如,在引号中,那么我得到的只是 ComboBox 中的文本,而不是实际变量(别介意我仍然不知道如何获取从 ComboBox 中选择的值来处理它——这是下一个障碍!)
简而言之,我最终想要做的是从 x 和 y 数据组合框中选择我想要绘制的变量,以便我可以在一个函数中使用它们:
self.data_line=self.graphWidget.plot(self.distance.A,self.aData.A_RX)
或
self.data_line=self.graphWidget.plot(self.distance.A,self.aData.A_RXph),
例如。
如果有人能向我指出一些简单的 GUI 应用程序的示例,这些应用程序的功能与我在这里尝试做的事情类似,那就太好了。我不适合这样做——我只是不知道有什么更好的。我觉得我把这种方式变得比它需要的更复杂。
解决方法
我不确定这是否是您的想法,但这里有一个小例子来说明如何将 namedtuple
的字段添加到 QComboBox
并使用当前选定的这些组合框中的字段用于在 matplotlib 图中绘制相应的数据:
from PyQt5 import QtWidgets
from collections import namedtuple
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np
type_distance = namedtuple('type_aData',['A_RX','A_RXlogmag','A_RXmag'])
type_aData = namedtuple('type_aData',['A','B'])
class Widget(QtWidgets.QWidget):
def __init__(self,parent=None):
super().__init__(parent)
# setup matplotlib figure
self.figure = Figure()
self.ax = self.figure.add_subplot(111)
self.canvas = FigureCanvas(self.figure)
# setup rest of ui
self.combo_x = QtWidgets.QComboBox(self)
self.combo_y = QtWidgets.QComboBox(self)
hlayout = QtWidgets.QHBoxLayout()
hlayout.addWidget(self.combo_x)
hlayout.addWidget(self.combo_y)
vlayout = QtWidgets.QVBoxLayout(self)
vlayout.addWidget(self.canvas)
vlayout.addLayout(hlayout)
# generate some random data
self.distance,self.data = self.generate_data()
# add field names of data to comboboxes
self.combo_x.addItems(self.distance._fields)
self.combo_y.addItems(self.data._fields)
# connect signals to slot to automatically update plot when selected fields have changed
self.combo_x.currentTextChanged.connect(self.plot)
self.combo_y.currentTextChanged.connect(self.plot)
self.plot()
def plot(self):
# extract field names and corresponding data that should be plotted
xlabel = self.combo_x.currentText()
ylabel = self.combo_y.currentText()
x_data = getattr(self.distance,xlabel)
y_data = getattr(self.data,ylabel)
# update plot with newly selected data
self.ax.clear()
self.ax.plot(x_data,y_data,'ro')
self.ax.set_xlabel(xlabel)
self.ax.set_ylabel(ylabel)
self.figure.tight_layout()
self.canvas.draw()
def generate_data(self):
# generate some random data and return data as type_distance and type_aData objects
npoints = 300
x_data = np.random.normal(size=npoints)
y_data_a = np.random.normal(size=npoints)
y_data_b = np.sin(x_data)
distance = type_distance(x_data,np.log(np.abs(x_data)),np.abs(x_data))
data = type_aData(y_data_a,y_data_b)
return distance,data
if __name__ == "__main__":
app = QtWidgets.QApplication([])
win = Widget()
win.show()
app.exec()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。