2017-07-28 67 views
0

我想在PyQt中使用嵌入式matplotlib绘制一个图形。 我使用Qt Designer作为主窗口,并为信号和插槽连接部分编写python代码。如何在PyQt4中使用matplotlib

所以我的代码如下所示:

import sys 
from PyQt4 import QtCore, QtGui, uic 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar 
import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 


qtCreatorFile = "main.ui" # my Qt Designer file 

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

class MyApp(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     Ui_MainWindow.__init__(self) 
     self.setupUi(self) 

     self.figure = plt.figure() 

     self.canvas = FigureCanvas(self.figure) 

     self.csvbutton.clicked.connect(self.plot) 

    def plot(self): 

     filePath="/path to csv file here" 
     df= pd.read_csv(str(filePath),index_col='date') 
     df.index = pd.to_datetime(df.index, unit='s') 
     ax = self.figure.add_subplot(111) 
     ax.hold(False) 
     ax.plot(df, '*-') 
     self.canvas.draw() 



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

我的主要问题是Qt设计文件和Python代码之间的联接,我不能在Qt Designer中直接设置画布组件和我仍然努力寻找错误在我的代码中的位置。 您的帮助非常感谢,谢谢。

+0

如果您没有设置画布的设计师比,在当前状态下,您的'self.canvas'不包含在窗口的任何布局中。试试这个:在设计器中,在想要放置画布的位置(QWidget,Groupbox等)创建一个容器类似于对象的容器。在代码中构建画布,将其添加到本地布局(例如'QHBoxLayout'),并在容器中创建一个'.setLayout(canvaslayout)'。这应该将您的画布正确放置在用户界面中。 – armatita

+0

你会得到什么错误? – Trilarion

回答

3

为了在Qt Designer中使用matplotlib不能直接完成的,为此,我们必须促进QWidget使用FigureCanvas或更好的,从它继承正如我在下面,我们首先创建一个文件名为Canvas类类所谓canvas.py:

canvas.py

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
import matplotlib.pyplot as plt 

class Canvas(FigureCanvas): 
    def __init__(self, parent=None): 
     self.figure = plt.figure() 
     FigureCanvas.__init__(self, self.figure) 
     self.setParent(parent) 

通过Qt设计创建设计后,我们拥有所有我们需要的元素,但在这里我们要放置的说法,我们使用Widget元素也就是在Containers,我们将其命名为canvas

enter image description here

然后我们用鼠标右键点击推广它,并选择选项promoted to ...

enter image description here

获得什么如下图所示,在Promoted Class Name我们把Canvas作为这个类的名字,在Header File我们把canvas.h(在头文件中放file.py文件,fo R实施例package.subpackage.file.h),然后按AddPromote

enter image description here

最后我们得到类似如下的文件结构:

. 
├── canvas.py 
└── main.ui 

然后我们创建文件main.py哪里我们将您的代码与小变化:

main.py

import matplotlib 
matplotlib.use('Qt4Agg') 

import sys 
from PyQt4 import QtCore, QtGui, uic 
import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 


qtCreatorFile = "main.ui" # my Qt Designer file 

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

class MyApp(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     Ui_MainWindow.__init__(self) 
     self.setupUi(self) 
     self.csvbutton.clicked.connect(self.plot) 

    def plot(self): 

     filePath="data.csv" 
     df= pd.read_csv(str(filePath),index_col='date') 
     ax = self.canvas.figure.add_subplot(111) 
     ax.hold(False) 
     ax.plot(df, '*-') 
     self.canvas.draw() 



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

最终我们得到如下:

enter image description here

你可以找到完整的项目here

+0

谢谢你的回答,这正是我需要知道的。 –