使用主窗口中的数据在第二个窗口中创建绘图

时间:2016-11-08 10:22:25

标签: python animation matplotlib pyqt4 qt-designer

我正在尝试制作一个程序,其中我有一个主窗口和一个第二个窗口。应通过选中主窗口中的Check-Box打开第二个窗口,并通过取消选中将其关闭。

下面的最小示例已经很好了(感谢ImportanceOfBeingErnest!),但是我想通过更改主窗口中的SpinBox来旋转箭头(运行示例时已经弯曲的箭头)。

解决方案:在第一个答案中查看第5条评论!

SELECT COUNT(COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_CATALOG = 'database' AND TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'table'

1 个答案:

答案 0 :(得分:0)

这是我认为你想要实现的一个工作范例 主窗口有一个旋转框和一个复选框。单击复选框后,将显示带有绘图的新窗口,并开始播放动画。当前值和一些数组将被赋予绘图窗口。如果在动画运行时更改旋转框值,则会更新它。当关闭绘图窗口或取消选中该复选框时,动画将停止(并被删除)。

import sys
from PyQt4 import QtGui, QtCore

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib import animation

import numpy as np


class Newsphere(QtGui.QMainWindow):

    def __init__(self):
        super(Newsphere, self).__init__()
        self.mainbox = QtGui.QWidget()
        self.mainbox.setLayout(QtGui.QHBoxLayout())
        self.setCentralWidget(self.mainbox)
        self.spin = QtGui.QSpinBox()
        self.spin.setValue(5)
        self.spin.setMaximum(10)
        self.spin.setMinimum(1)
        self.checkPlot = QtGui.QCheckBox("Check")
        self.mainbox.layout().addWidget(self.spin)
        self.mainbox.layout().addWidget(self.checkPlot)

        self.Plot = None
        self.checkPlot.clicked.connect(self.showPlot)

    def showPlot(self):
        if self.Plot == None:
            self.Plot = Plot(self.kinematic(), self.spin.value())
            self.Plot.show()
            # register signal for closure
            self.Plot.signalClose.connect(self.uncheck)
            # register signal for spin value changed
            self.spin.valueChanged.connect(self.Plot.update_factor)
        else:
            self.Plot.close()
            self.Plot = None

    def kinematic(self):
        v = np.array([[1.,2.,3.],[2.,1.,3.],[3.,2.,1.]])
        return v

    def uncheck(self):
        self.checkPlot.setChecked(False)
        self.Plot = None

class Plot(QtGui.QWidget):

    signalClose = QtCore.pyqtSignal()

    def __init__(self, v=None, factor=1):
        super(Plot, self).__init__()
        self.setLayout(QtGui.QHBoxLayout())

        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(111,projection = '3d')
        self.ax.set_aspect('equal')
        self.fig.tight_layout()
        self.ax.view_init(40, 225)

        self.ax.set_xlim3d(0,3)
        self.ax.set_ylim3d(0,3)
        self.ax.set_zlim3d(0,4)

        self.canvas = FigureCanvas(self.fig)
        self.layout().addWidget(self.canvas)

        self.pos = v

        self.setup_plot()
        self.update_factor(factor)

        self.ani = animation.FuncAnimation(self.fig, self.update_plot, blit=False)

    def setup_plot(self):
        xpos, ypos = np.meshgrid(np.arange(self.pos.shape[0]),np.arange(self.pos.shape[1]) )
        self.xpos = xpos.flatten('F')
        self.ypos = ypos.flatten('F')
        self.zpos = np.zeros_like(self.xpos)
        self.bar = None

    def update_factor(self, factor):
        self.factor = factor
        self.dx = np.ones_like(self.xpos)*np.min(np.abs(self.factor/10.), 0.1)
        self.dy = self.dx.copy()

    def update_plot(self, i):

        if self.bar != None:
            self.bar.remove()
            del self.bar
        pos = self.pos+np.sin(i/8.)
        dz = pos.flatten()

        self.bar = self.ax.bar3d(self.xpos, self.ypos, self.zpos, self.dx, self.dy, dz, 
                        color=(1.-self.factor/10.,0,self.factor/10.), zsort='average', linewidth=0)

        self.canvas.draw()

    # We need to make sure the animation stops, when the window is closed
    def closeEvent(self, event):
        self.signalClose.emit()
        self.close()
        super(Plot, self).closeEvent(event)

    def close(self):
        self.ani.event_source.stop()
        super(Plot, self).close()


if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)    
    main = Newsphere()
    main.show()
    sys.exit(app.exec_())

由于我不确定你想要制作什么动画,我将情节更改为条形图,但你可以将它改回到你需要的任何地方。希望有所帮助。