微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以将“type”类型的变量传递给 ComboBox,以便集合的所有元素都可以选择?

如何解决是否可以将“type”类型的变量传递给 ComboBox,以便集合的所有元素都可以选择?

我正在尝试创建一个 GUI 应用程序,让我可以针对任何其他变量绘制任何变量。这是我的第一个 GUI 应用程序,所以也许我咬得比我能咀嚼的多。这些变量的值在数组中,我将它们分组到集合中——也就是说,我使用 collections.nametuple 对原始值、计算的幅度和相位、峰值索引和归一化值进行分组(如果例如,我没有使用正确的术语)。

我想要做的是将所有这些变量(或各种集合的元素(?)作为两个组合框、xdata 和 ydata 中的选择),以便我可以针对任何其他变量绘制任何变量。这是否甚至可能吗?这是我正在尝试创建的应用程序的 MainWindow:

enter image description here

我可以选择文件和解析数据,例如,假设我从文件中的数据创建了这两个集合:

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()

screen shot

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?