2017-02-09 2 views
2

Я создаю графический интерфейс, который должен иметь пару полей ввода пользователя и график, который будет использовать коэффициенты в поле ввода для масштабирования данных. Для GUI потребуется кнопка «Применить» и кнопку «Экспорт». Я использую PyQt5 для графического интерфейса и Matplotlib для построения графика. Мой подход заключался в создании отдельных QWidgets для сюжета и ящиков ввода и их связывания в третьем QMainWindow.Переменные между классами для масштабирования в графическом интерфейсе PyQt

I have the GUI appearing correctly

Как я могу получить кнопку применить, чтобы отправить 3 переменные по основному классу и классу черчения? Было бы возможно, чтобы все это происходило в одном классе, чтобы упростить работу моих переменных?

import sys 
import matplotlib 
matplotlib.use("Qt5Agg") 
from PyQt5 import QtCore 
from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject 
from PyQt5.QtWidgets import * 
from numpy import arange, sin, pi 
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.figure import Figure 

class AppForm(QWidget): 

    def __init__(self): 
     # Initialize the object as a QWidget and 
     # set its title and minimum width 
     QWidget.__init__(self) 
     self.setWindowTitle('Input') 
     self.setMinimumWidth(400) 

     # Create the QVBoxLayout that lays out the whole form 
     self.layout = QVBoxLayout() 

     # Create the form layout that manages the labeled controls 
     self.form_layout = QFormLayout() 

     self.aFactor = QLineEdit(self) 
     self.mFactor = QLineEdit(self) 
     self.cZone = QLineEdit(self) 

     self.form_layout.addRow('AFactor', self.aFactor) 
     self.form_layout.addRow('MFactor', self.mFactor) 
     self.form_layout.addRow('CZone', self.cZone) 

     self.layout.addLayout(self.form_layout) 
     self.button_box = QHBoxLayout() 
     self.button_box.addStretch(1) 

     self.apply_button = QPushButton("Apply", self) 
     self.output_button = QPushButton("Output", self) 

     self.button_box.addWidget(self.apply_button) 
     self.button_box.addWidget(self.output_button) 
     self.layout.addLayout(self.button_box) 
     self.setLayout(self.layout) 

     self.apply_button.clicked.connect(self.applyButton) 

    def applyButton(self): 
     self.af = self.aFactor 
     self.mf = self.mFactor 
     self.cz = self.cZone 

     print self.af.text(), self.mf.text(), self.cz.text() 

class MyMplCanvas(FigureCanvas): 
    """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).""" 
    def __init__(self, parent=None, width=5, height=4, dpi=100, title='title'): 
     self.title = title 
     fig = Figure(figsize=(width, height), dpi=dpi) 
     self.axes = fig.add_subplot(111) 
     fig.suptitle(title) 

     # We want the axes cleared every time plot() is called 
     self.axes.hold(False) 

     self.compute_initial_figure() 


     FigureCanvas.__init__(self, fig) 
     self.setParent(parent) 

     FigureCanvas.setSizePolicy(self, 
       QSizePolicy.Expanding, 
       QSizePolicy.Expanding) 
     FigureCanvas.updateGeometry(self) 

    def compute_initial_figure(self): 
     pass 


class MyStaticMplCanvas(MyMplCanvas): 
    """Simple canvas with a sine plot.""" 
    def compute_initial_figure(self): 
     t = arange(0.0, 3.0, 0.01) 
     s = sin(2*pi*t) 
     self.axes.plot(t, s) 
     self.axes.set_ylabel('label1') 
     self.axes.set_xlabel('label') 
     self.axes.grid(True) 



class ApplicationWindow(QMainWindow): 
    def __init__(self): 
     QMainWindow.__init__(self) 
     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
     self.setWindowTitle("application main window") 
     self.setMinimumWidth(800) 
     self.setMinimumHeight(600) 

     self.file_menu = QMenu('&File', self) 
     self.file_menu.addAction('&Quit', self.fileQuit, 
       QtCore.Qt.CTRL + QtCore.Qt.Key_Q) 
     self.menuBar().addMenu(self.file_menu) 

     self.help_menu = QMenu('&Help', self) 
     self.menuBar().addSeparator() 
     self.menuBar().addMenu(self.help_menu) 

     self.help_menu.addAction('&About', self.about) 

     self.main_widget = QWidget(self) 

     l = QVBoxLayout(self.main_widget) 
     form = AppForm() 
     sc = MyStaticMplCanvas(self.main_widget, width=5, height=4, dpi=100, title='Title 1') 
     l.addWidget(form) 
     l.addWidget(sc) 

     self.main_widget.setFocus() 
     self.setCentralWidget(self.main_widget) 

     #self.statusBar().showMessage("Cool", 2000 

    def fileQuit(self): 
     self.close() 

    def closeEvent(self, ce): 
     self.fileQuit() 

    def about(self): 
     QMessageBox.about(self, "About",) 


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

    aw = ApplicationWindow() 
    aw.setWindowTitle("PyQt5 Matplot Example") 
    aw.show() 
    #sys.exit(qApp.exec_()) 
    app.exec_() 

ответ

1

Есть несколько вариантов здесь:

(а) Peform работы в главном классе: Вместо подключение кнопки в AppForm к способу в AppForm, сделать то же самое в ApplicationWindow.

self.form = AppForm() 
self.sc = MyStaticMplCanvas(....) 
self.form.apply_button.clicked.connect(self.applyButton) 

def applyButton(self): 
    tx = self.form.aFactor.text() 
    # do something with tx 
    # e.g. call a method from MplCanvas 
    self.sc.someMethod(tx) 

(б) Использование сигналов и слотов: Создать signla в AppForm. После нажатия кнопки applyButton может излучать этот сигнал с соответствующим контентом. В ApplicationWindow подключите этот сигнал к методу, который может каким-то образом использовать предоставленные данные. Вы также можете подключить его непосредственно к методу MplCanvas.

class AppForm(QWidget): 
    mysignal = pyqtSignal(object) 
    def __init__(self): 
     .... 
     self.apply_button.clicked.connect(self.applyButton) 

    def applyButton(self): 
     self.mysignalemit((self.aFactor.text(),self.mFactor.text(), self.cZone())) 

class ApplicationWindow(QMainWindow): 
    def __init__(self): 
     .... 
     self.form = AppForm() 
     self.sc = MyStaticMplCanvas(....) 
     self.form.mysignal.connect(self.useButtonResults) 
     self.form.mysignal.connect(self.sc.someMethod) 

    def useButtonResults(self, obj): 
     a,b,c = obj 
     # do something with a, b, c 

(с) использовать один класс, чтобы сделать все: Просто поместите все в одном классе, и делать все, что вам нравится.

Смежные вопросы