使用按钮打开和关闭matplotlib小部件

时间:2018-08-12 10:16:31

标签: python matplotlib button pyqt5

到目前为止,我写的目的是在GUI中有一个“温度”按钮,当按下该按钮时,将打开我单独制作的matplotlib图(mplwidget.py)。

但是,当我运行代码时,应用程序和小部件同时打开,并且温度按钮似乎没有任何功能(即使我关闭了小部件,按下按钮也不会再次打开它)。 / p>

import sys
from PyQt5.QtCore import QCoreApplication

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QAction, QMessageBox
from PyQt5.uic.properties import QtGui

from mplwidget import animate #import animation widget

class window(QMainWindow):

    def __init__(self):
        super(window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle('Temperature Control')
        self.setWindowIcon(QIcon('adn.png'))

        extractAction = QAction('&Quit', self)
        extractAction.setShortcut('Ctrl+Q')
        extractAction.setStatusTip('leave the app')
        extractAction.triggered.connect(self.close_application)

        self.statusBar()

        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('&File')
        fileMenu.addAction(extractAction)

        self.home()

    def home(self):
        btn = QPushButton('quit', self)
        btn.clicked.connect(self.close_application)
        btn.resize(btn.sizeHint())
        btn.move(0, 100)

        button = QPushButton('Temperature',self)
        button.clicked.connect(self.opengraph)
        button.move(50,200)
        self.show()

    def opengraph(self):
        animate()

    def close_application(self):

        choice = QMessageBox.question(self, 'Message',
                                     "Are you sure to quit?", QMessageBox.Yes |
                                     QMessageBox.No, QMessageBox.No)

        if choice == QMessageBox.Yes:
            sys.exit()
        else:
            pass

if __name__ == "__main__":

    def run():
        app = QApplication(sys.argv)
        Gui = window()
        sys.exit(app.exec_())

run()

mplwidget在下面

def GraphWidget():

    fig = plt.figure()
    ax1 = fig.add_subplot(1,1,1)

    Time = []
    Temp = []

    def animate(i):

        x = datetime.datetime.now()
        y = numpy.random.randint(48,52)
        Time.append(x)
        Temp.append(int(y))    

    #    print (Temp)
        ax1.plot(Time,Temp)

    ani = animation.FuncAnimation(fig,animate, interval=1000)
    plt.show()

2 个答案:

答案 0 :(得分:1)

问题在于plt.show()本身无法启动事件循环,因为由于打开了QT窗口,事件循环已在运行。在这种情况下,可能需要调用fig.show(),其中fig是使用中的图形。

这又导致了mplwidget.py模块中的函数实际上返回的问题。一旦返回,动画的引用将丢失,将被垃圾回收;因此屏幕上没有动画。

解决方案是让函数返回动画并将其存储在主程序中的某个位置。

import sys
from PyQt5.QtCore import QCoreApplication

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QAction, QMessageBox
from PyQt5.uic.properties import QtGui

from mplwidget import showgraph

class window(QMainWindow):

    def __init__(self):
        super(window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle('Temperature Control')
        self.setWindowIcon(QIcon('adn.png'))

        extractAction = QAction('&Quit', self)
        extractAction.setShortcut('Ctrl+Q')
        extractAction.setStatusTip('leave the app')
        extractAction.triggered.connect(self.close_application)

        self.statusBar()

        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('&File')
        fileMenu.addAction(extractAction)

        self.home()

    def home(self):
        btn = QPushButton('quit', self)
        btn.clicked.connect(self.close_application)
        btn.resize(btn.sizeHint())
        btn.move(0, 100)

        button = QPushButton('Temperature',self)
        button.clicked.connect(self.opengraph)
        button.move(50,200)
        self.show()

    def opengraph(self):
        self.store = showgraph()

    def close_application(self):

        choice = QMessageBox.question(self, 'Message',
                                     "Are you sure to quit?", QMessageBox.Yes |
                                     QMessageBox.No, QMessageBox.No)

        if choice == QMessageBox.Yes:
            sys.exit()
        else:
            pass

if __name__ == "__main__":

    def run():
        app = QApplication(sys.argv)
        Gui = window()
        sys.exit(app.exec_())

run()

mplwidget.py:

import matplotlib.pyplot as plt
import datetime
import numpy
import matplotlib.animation as animation

def showgraph():

    fig = plt.figure()
    ax1 = fig.add_subplot(1,1,1)

    Time = []
    Temp = []

    def animate(i):

        x = datetime.datetime.now()
        y = numpy.random.randint(48,52)
        Time.append(x)
        Temp.append(int(y))    

        ax1.plot(Time,Temp)

    ani = animation.FuncAnimation(fig,animate, interval=1000)
    fig.show()
    return fig, ani

答案 1 :(得分:0)

尝试一下:

import sys
from PyQt5.QtGui     import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QAction, QMessageBox

from mplwidget import MplWindow                     # +++

class window(QMainWindow):

    def __init__(self):
        super(window, self).__init__()
        self.setGeometry(50, 50, 500, 300)
        self.setWindowTitle('Temperature Control')
        self.setWindowIcon(QIcon('adn.png'))
        extractAction = QAction('&Quit', self)
        extractAction.setShortcut('Ctrl+Q')
        extractAction.setStatusTip('leave the app')
        extractAction.triggered.connect(self.close_application)
        self.statusBar()
        mainMenu = self.menuBar()
        fileMenu = mainMenu.addMenu('&File')
        fileMenu.addAction(extractAction)

        self.matplWindow = MplWindow()               # +++

        self.home()


    def home(self):
        btn = QPushButton('quit', self)
        btn.clicked.connect(self.close_application)
        btn.resize(btn.sizeHint())
        btn.move(0, 100)
        button = QPushButton('Temperature',self)
        button.clicked.connect(self.opengraph)
        button.move(50,200)
        self.show()

    def opengraph(self):
        self.matplWindow.funAnimation()              # +++

    def close_application(self):
        choice = QMessageBox.question(self, 'Message',
                                     "Are you sure to quit?", QMessageBox.Yes |
                                     QMessageBox.No, QMessageBox.No)
        if choice == QMessageBox.Yes:
            sys.exit()
        else:
            pass

if __name__ == "__main__":
    app = QApplication(sys.argv)
    Gui = window()
    sys.exit(app.exec_())

mplwidget.py

import matplotlib.pyplot as plt
import numpy
import datetime
import matplotlib.animation as animation
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout


class MplWindow(QDialog):
    Time = []
    Temp = []
    def __init__(self, parent=None):
        super(MplWindow, self).__init__(parent)

    def funAnimation(self):        
        self.fig = plt.figure()
        self.ax1 = self.fig.add_subplot(1,1,1)
        self.ani = animation.FuncAnimation(self.fig, self.animate, interval=1000)
        plt.show()

    def animate(self, i):
        x = datetime.datetime.now()
        y = numpy.random.randint(48,52)
        self.Time.append(x)
        self.Temp.append(int(y))    
        self.ax1.plot(self.Time, self.Temp)

enter image description here