Соединение Pyside с Matplotlib с использованием QtDesigner - с помощью pushButton для рисования - PullRequest
2 голосов
/ 29 февраля 2012

Это дополнительный вопрос из этого. Соединение Pyside с matplotlib

Мой PythonFu не позволяет мне сделать простую вещь: спроектировать графический интерфейс с использованием QtDesigner, преобразовать его и сделать QPushButton для рисования чего-либо.Он работает, когда 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

Кнопка подключения работает, но график никогда не отображается.

Спасибо!

1 Ответ

3 голосов
/ 05 марта 2012

В вашем main.py модуле заменить

self.main_frame.widget.canvas.draw()

с

self.main_frame.widget.draw()

Из моего понимания matplotlib вы рисовали не тот холст. Согласно документам продвигаемый вами виджет теперь является вашим холстом, и именно его вы должны нарисовать.

...