如何实现QPushbutton发出pyqt信号并调用另一个类?

时间:2017-07-25 16:41:31

标签: python matplotlib pyqt5 signals-slots

我正在尝试学习发射/接收信号的基本用法,我遇到了一些麻烦。

我想从一些基本的东西开始,所以我创建了一个MainWindow并放置一个名为“plot”的QPushButton。

当按下按钮时,它接受参数(self,xdata,ydata)并从我的类MainWindow(QMainWindow)运行方法initiatePlot

    self.plotbtn = QPushButton("Plot")
    self.plotbtn.clicked.connect(partial(self.initiatePlot, xdata, ydata))

    def initiatePlot(self,x,y):
        PlotSignal = pyqtSignal(list, list)
        self.PlotSignal.emit(x, y)

之后我尝试将它连接到我的绘图仪类,但我得到“处理完成退出代码1”我相信错误来自我下面的类中的这一特定代码行。

self.PlotSignal.connect(self.plotData)

绘图类的代码

class createFIG(FigureCanvas):
  def __init__(self):
    #super().__init__(Figure(tight_layout=True))
    self.figure = plt.figure()
    self.axes = self.figure.add_subplot(111)

    self.name = ""

    # xdata = [1,2,3,4,5]
    # ydata = [12,4,56,78,9]

    plt.figure()
    self.axes.set_xlabel('x label')

    #self.plotData(xdata,ydata)

    self.PlotSignal.connect(self.plotData)


  def plotData(self, xdata,ydata):
    print("plotting")
    self.axes.plot(xdata, ydata)
    self.draw()
    plt.show()

对不起,空格可能有点混乱。

目前的问题是如何接收我从initiatePlot方法发出的信号。

最终目标是能够单击绘图按钮并每次创建一个带有新绘图的新窗口。

如果有一种更简单的方法可以将主窗口中的按钮链接到有用的绘图类。

以下是我的完整代码的链接:https://github.com/Silvuurleaf/InteractiveGraphing/blob/master/LiveGraphing.py

1 个答案:

答案 0 :(得分:1)

如上所述,我不确定这是否真的是你想要的,但是每次按下按钮时,下面的代码应该创建一个新的matplotlib窗口。

import sys
#Importing PyQt5 library to construct widgets for Graphic User Interface (GUI) application
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import (QLineEdit, QPushButton, QSlider, QApplication, QVBoxLayout, QHBoxLayout,
                             QWidget, QLabel, QCheckBox, QRadioButton, QPlainTextEdit, QSizePolicy,
                             QMainWindow,QFrame, QFileDialog, QTableWidgetItem, QTableWidget, QMenu, QMessageBox,
                             QAction, QToolBar)
from PyQt5.QtCore import Qt, QAbstractTableModel, pyqtSignal

from functools import partial
import matplotlib
matplotlib.use("Qt5Agg")

from matplotlib import pyplot as plt
plt.style.use(['ggplot'])

class createFIG():
    def __init__(self):
        self.figure = plt.figure()
        self.axes = self.figure.add_subplot(111)
        self.name = ""
        self.axes.set_xlabel('x label')

    def plotData(self, xdata,ydata):
        print("plotting")
        self.axes.plot(xdata, ydata)
        plt.show()


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle("Perspective")

        self.initializeUI()

    def initializeUI(self):

        xdata = [1,2,3,4,5]
        ydata = [12,4,56,78,9]

        #Main Widget
        self.main_widget = QWidget(self)
        self.setCentralWidget(self.main_widget)

        self.plotbtn = QPushButton("Plot")
        self.plotbtn.clicked.connect(partial(self.initiatePlot, xdata, ydata))

        self.hMAIN = QHBoxLayout(self.main_widget)
        self.vboxLeft = QVBoxLayout()
        self.vboxLeft.addWidget(self.plotbtn)

        self.hbox1 = QHBoxLayout()

        self.vboxLeft.addLayout(self.hbox1)

        self.PlotLayout = QVBoxLayout()

        self.hMAIN.addLayout(self.vboxLeft)
        self.hMAIN.addLayout(self.PlotLayout)

        self.show()

    def initiatePlot(self,x,y):
        print("emit signal")
        f = createFIG()
        f.plotData(x, y)


def main():
        # main loop
        app = QApplication(sys.argv)
        # instance
        window = MainWindow()
        window.show()
        # appWindow = MainWindow()
        sys.exit(app.exec_())

if __name__ == "__main__":
    main()