2012-02-29 32 views
2

這是此問題的後續問題。 Connecting Pyside with matplotlib使用QtDesigner將Pyside與Matplotlib連接 - 使用pushButton繪製

我的PythonFu無法讓我做一件簡單的事情:使用QtDesigner設計一個GUI,將其轉換爲QPushButton並繪製一些東西。它在QtDesigner未被使用時起作用,但隨着應用程序變得越來越複雜,需要QtDesigner,因此必須使用QtDesigner。下面是代碼:

** ** main.py

import sys 
import platform 

import numpy as np 
import PySide 
from PySide import QtCore 
from PySide.QtGui import QApplication, QMainWindow, QTextEdit,\ 
         QPushButton, QMessageBox, QWidget, QVBoxLayout 





__version__ = '0.0.1' 

from mpl import Ui_MainWindow 

class MainWindow(QMainWindow, Ui_MainWindow): 


    def __init__(self, parent=None): 

     super(MainWindow, self).__init__(parent) 

     self.main_frame = Ui_MainWindow() 
     self.main_frame.setupUi(self) 

     #self.button = QPushButton('Run') 
    def plot_stuff(self): 

     x = np.arange(1024) 
     self.main_frame.widget.axes.plot(np.exp(-x/256) * np.cos(2 * np.pi * x/32), 'g') 
     self.main_frame.widget.canvas.draw() 




if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    frame = MainWindow() 

    frame.main_frame.pushButton.clicked.connect(frame.plot_stuff) 

    frame.show() 
    app.exec_() 

** ** matplotlibwidget.py

import matplotlib 

matplotlib.use('Qt4Agg') 
matplotlib.rcParams['backend.qt4']='PySide' 


from matplotlib.figure import Figure 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 



class MatplotlibWidget(FigureCanvas): 

    def __init__(self, parent=None): 
     super(MatplotlibWidget, self).__init__(Figure()) 

     self.setParent(parent) 
     self.figure = Figure() 
     self.canvas = FigureCanvas(self.figure) 
     self.axes = self.figure.add_subplot(111) 

和** ** mpl.py,從MPL轉換。 ui

from PySide import QtCore, QtGui 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(640, 480) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(20, 410, 74, 20)) 
     self.pushButton.setObjectName("pushButton") 
     self.widget = MatplotlibWidget(self.centralwidget) 
     self.widget.setGeometry(QtCore.QRect(100, 40, 471, 321)) 
     self.widget.setObjectName("widget") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 17)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) 
     self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Run", None, QtGui.QApplication.UnicodeUTF8)) 

from widgets.matplotlibwidget import MatplotlibWidget 

按鈕連接起作用,但圖表從不顯示。

謝謝!

+0

您是否將此行從'widgets.matplotlibwidget import MatplotlibWidget'添加到mpl.py? – Jeff 2012-03-01 02:34:49

+0

看起來像是將該行添加到轉換後的.ui文件。你不應該那樣做。你想要做的就是在QtDesigner中通過右鍵單擊並選擇「Promote to ...」,然後選擇你想要提升的那個模塊來推廣這個小部件。這應該有助於http://developer.qt.nokia.com/doc/qt-4.8/designer-using-custom-widgets.html – Jeff 2012-03-01 03:13:30

+0

@Jeff,當我在Designer中推廣Widget時,Designer就是自動包含該行的人員之一, 如你所說。當我宣傳包含該行的Widget時。有什麼想法嗎? – Ivan 2012-03-05 14:26:09

回答

3

在你main.py模塊更換

self.main_frame.widget.canvas.draw() 

self.main_frame.widget.draw() 

從我的理解的matplotlib你畫錯了畫布。根據docs,您宣傳的小工具現在是您的畫布,這就是您應該畫的那個。

+0

那麼現在所有使用畫布的操作都應該在小部件上完成,而不是在widget.canvas上完成?謝謝 – Ivan 2012-03-06 13:17:41

+0

順便說一句,現在我必須使用self.main_frame.widget.plot而不是self.main_frame.widget.axes.plot? – Ivan 2012-03-06 14:32:41