Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 21, 2021 14:03:33

dendonnar
Зарегистрирован: 2021-10-21
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

ПРИВЕТ, НУЖНА ПОМОЩЬ С matplotlib python Уже давно ковыряюсь

Привет друзья, товарищи. Вот где-то недельку назад понадобилось сделать простую программу на 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_())

Буду оверблагодарен за помощь



Прикреплённый файлы:
attachment Screenshot_264.png (237,8 KБ)

Офлайн

#2 Окт. 21, 2021 14:45:05

dendonnar
Зарегистрирован: 2021-10-21
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

ПРИВЕТ, НУЖНА ПОМОЩЬ С matplotlib python Уже давно ковыряюсь

Если кто в силах сделать что-то вроде

 if self.line.text() == 'sin(1)':
рисуем синус sin(1)

Офлайн

#3 Дек. 6, 2021 15:59:34

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

ПРИВЕТ, НУЖНА ПОМОЩЬ С matplotlib python Уже давно ковыряюсь

А в чем проблема? Сделайте функцию, которая будет рисовать “sin(x)”, “cos(x)” и что там еще надо, а дальше вводимую строку можно парсить хоть руками, хоть регекспами, а хоть ast или еще чего-нибудь.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version