简体   繁体   中英

Transfer data from a scatterplot to a lineEdit - Matplotlib and Pyqt5

I have GUI developed with PyQt5 with an interactive scatterplot in a widget and 2 lineEdit . By clicking a dot, I can get the x and y values but I can't populate my two lineEdit with the two values.

Front_end code:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(539, 400)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.lineEdit.sizePolicy().hasHeightForWidth())
        self.lineEdit.setSizePolicy(sizePolicy)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 0, 0, 1, 1)
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setObjectName("widget")
        self.gridLayout.addWidget(self.widget, 0, 1, 2, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.lineEdit_2.sizePolicy().hasHeightForWidth())
        self.lineEdit_2.setSizePolicy(sizePolicy)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout.addWidget(self.lineEdit_2, 1, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Back_end code:

import sys
import matplotlib.pyplot as plt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QSizePolicy
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
from front_test import Ui_MainWindow


class Graph_init(FigureCanvas):

    def __init__(self, parent=None):
        fig = Figure()
        fig.patch.set_facecolor("None")
        self.axes = fig.add_subplot(111)
        self.compute_initial_figure()
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)
        FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)
        FigureCanvas.mpl_connect(self, 'pick_event', self.onclick)

    def onclick(self, event):
        ind = event.ind[0]
        data = event.artist.get_offsets()
        xdata, ydata = data[ind,:]
        print ((xdata, ydata))

        index = [10,20,30].index(xdata)

        x = [10,20,30]
        y = [100,100,150]
        size = [1000,2000,3000]

        x_high = x[index]
        y_high = y[index]
        size_high = size[index]

        del x[index]
        del y[index]
        del size[index]

        self.axes.clear()
        self.axes.scatter(x, y, s=size, color='blue', picker=1, alpha=0.3)
        self.axes.scatter(x_high, y_high, s=size_high, color='red', picker=1, alpha=0.3)
        self.axes.figure.canvas.draw()

        #self.lineEdit.setText(xdata)
        #self.lineEdit_2.setText(ydata)


class Graph_populate(Graph_init):

    def compute_initial_figure(self):
        x = [10,20,30]
        y = [100,100,150]
        size = [1000,2000,3000]
        self.axes.scatter(x,y,s=size,color='blue', picker=1, alpha=0.3)


class GUI(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(GUI, self).__init__(parent)
        self.setupUi(self)
        self.sc = Graph_populate(self.widget)
        self.gridLayout.addWidget(self.sc, 0, 1, 2, 1)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    prog = GUI()
    prog.showMaximized()
    sys.exit(app.exec_())

Thank you

You can not update the QLineEdits in Graph_init since they do not exist in that context, in those cases it is advisable to send the information where the context exists through a signal, this signal must be created:

posClicked = QtCore.pyqtSignal(tuple)

And when you want to send emit() is used

self.posClicked.emit((xdata, ydata))

Then it must be connected to a slot where it is used to fill the QLineEdits as shown below:

class Graph_init(FigureCanvas):
    posClicked = QtCore.pyqtSignal(tuple)
    def __init__(self, parent=None):
        [...]

    def onclick(self, event):
        ind = event.ind[0]
        data = event.artist.get_offsets()
        xdata, ydata = data[ind,:]
        print ((xdata, ydata))

        [...]
        self.axes.figure.canvas.draw()

        self.posClicked.emit((xdata, ydata))


class GUI(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(GUI, self).__init__(parent)
        self.setupUi(self)
        self.sc = Graph_populate(self.widget)
        self.gridLayout.addWidget(self.sc, 0, 1, 2, 1)
        self.sc.posClicked.connect(self.onPosClicked)

    def onPosClicked(self, values):
        xdata, ydata = values
        self.lineEdit.setText(str(xdata))
        self.lineEdit_2.setText(str(ydata))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM