到目前为止,我写的目的是在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()
答案 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)