Форум сайта python.su
Привет друзья, товарищи. Вот где-то недельку назад понадобилось сделать простую программу на python'е с использованием библиотеки matplotlib. Перехожу сразу к делу. Есть у меня окно, а чтобы наглядно было, я прикреплю скриншот. В верхнем правом углу есть окно ввода. Так вот, нужно сделать так, чтобы после ввода функции в окошко, график сам ее рисовал в соответствии с заданными значениями.
Код привожу ниже.
import math import sys from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QAction, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QSpacerItem, QSizePolicy, QPushButton from PyQt5.QtGui import QIcon from PyQt5.QtCore import QSize from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure import matplotlib.pyplot as plt import mplcyberpunk import random plt.style.use("cyberpunk") from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar import numpy as np class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.title = 'Moja appka' self.left = 10 self.top = 10 self.width = 1920 self.height = 1080 self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.statusBar().showMessage('Ready') mainMenu = self.menuBar() mainMenu.setNativeMenuBar(False) fileMenu = mainMenu.addMenu('Plik') helpMenu = mainMenu.addMenu('Pomoc') self.move(150,150) exitButton = QAction(QIcon('exit24.png'), 'Exit', self) exitButton.setShortcut('Ctrl+Q') exitButton.setStatusTip('Wyjsc z programu') exitButton.triggered.connect(self.close) fileMenu.addAction(exitButton) widget = QWidget(self) self.setCentralWidget(widget) vlay = QVBoxLayout(widget) hlay = QHBoxLayout() vlay.addLayout(hlay) self.nameLabel = QLabel('Nazwa:', self) self.line = QLineEdit(self) self.nameLabel2 = QLabel('Wynik', self) hlay.addWidget(self.nameLabel) hlay.addWidget(self.line) hlay.addWidget(self.nameLabel2) hlay.addItem(QSpacerItem(1000, 10, QSizePolicy.Expanding)) pybutton = QPushButton('Wcisnij mnie:)', self) pybutton.clicked.connect(self.clickMethod) hlay2 = QHBoxLayout() hlay2.addWidget(pybutton) hlay2.addItem(QSpacerItem(1000, 10, QSizePolicy.Expanding)) vlay.addLayout(hlay2) m = WidgetPlot(self) vlay.addWidget(m) def clickMethod(self):#вот здесь я и хочу это все мероприятие обрабатывать print('Clicked Pyqt button.') if self.line.text() == 'sin(1)': self.statusBar().showMessage('Not a Number') else: print('Number: {}'.format(float(self.line.text())*2)) self.statusBar().showMessage('Introduction of a number') self.nameLabel2.setText(str(float(self.line.text())*2)) class WidgetPlot(QWidget): def __init__(self, *args, **kwargs): QWidget.__init__(self, *args, **kwargs) self.setLayout(QVBoxLayout()) self.canvas = PlotCanvas(self, width=10, height=8) self.toolbar = NavigationToolbar(self.canvas, self) self.layout().addWidget(self.toolbar) #self.toolbar.configure_subplots() self.layout().addWidget(self.canvas) class PlotCanvas(FigureCanvas): def __init__(self, parent=None, width=10, height=8, dpi=150): fig = Figure(figsize=(width, height), dpi=dpi) FigureCanvas.__init__(self, fig) self.setParent(parent) FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding) FigureCanvas.updateGeometry(self) self.plot() def plot(self): ax = self.figure.add_subplot(111) ax.set_title('Joanna Bihun',fontsize=14) ax.spines['left'].set_position('center') ax.spines['bottom'].set_position('center') ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') x = np.arange(0, 10, 0.1) y = np.sin(x) z = np.cos(x) ax.plot(x, np.sin(y), '-', label='Sin(x)') ax.plot(x, np.cos(z), '-', label='Cos(x)') ax.legend(framealpha=1, fontsize=13, frameon=True); mplcyberpunk.make_lines_glow(ax) mplcyberpunk.add_underglow(ax) plt.style.use("dark_background") #mplcyberpunk.add_glow_effects(ax) self.draw() if __name__ == "__main__": app = QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit( app.exec_())
Прикреплённый файлы:
Screenshot_264.png (237,8 KБ)
Офлайн
Если кто в силах сделать что-то вроде
if self.line.text() == 'sin(1)': рисуем синус sin(1)
Офлайн
А в чем проблема? Сделайте функцию, которая будет рисовать “sin(x)”, “cos(x)” и что там еще надо, а дальше вводимую строку можно парсить хоть руками, хоть регекспами, а хоть ast или еще чего-нибудь.
Офлайн