Найти - Пользователи
Полная версия: PyQt5(QWidget) + matplotlib
Начало » GUI » PyQt5(QWidget) + matplotlib
1
PROkaZZZniK
Доброго времени суток.
Python 3.5
PyQt5(Qt Designer + PyUic)
Накидал в дизайнере форму.(рис 1.)
Есть скрипт который выводит на экран анимированный график matplotlib.
 import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib
# import pylab
import numpy as np
R = 5
T = 19
def x_rez(t):
    return R * (t - np.sin(t))
def y_rez(t):
    return R * (1 - np.cos(t))
def f_res():
    list1 = []
    X = []
    Y = []
    t = 0
    while t < T:
        X.append(x_rez(t))
        Y.append(y_rez(t))
        t += 0.01
    list1.append(X)
    list1.append(Y)
    return list1
def init():
    ax.set_xlim(-10, 2 * np.pi * R * 3 + 1)
    ax.set_ylim(-2, R * 5 + 20)
    return ln,
def update(frame):
    x_frame = x_rez(frame)
    y_frame = y_rez(frame)
    xdata.append(x_frame)
    ydata.append(y_frame)
    x, y = patch.center
    x = x_frame
    patch.center = (x, y)
    ln.set_data(xdata, ydata)
    patchC.center = (x_frame, y_frame)
    #patchLine.set_data([x_frame, x], [y_frame, y])
    #print(x_frame, y_frame)
    #ax.add_line(patchLine)
    ax.add_patch(patch)
    ax.add_patch(patchC)
    return ln, patch, patchC,
if __name__ == "__main__":
    # res1 = f_res()
    # print('res1', type(res1), res1)
    # plt.plot(res1[0], res1[1])
    # plt.ylim(-2, R*5)
    # plt.xlim(-10, 2*math.pi*R*3+1)
    fig, ax = plt.subplots()
    xdata, ydata = [], []
    ln, = plt.plot([], [], animated=True)
    fig.set_size_inches(10, 5)
    ax.set_ylim(-2, (x_rez(19) + 5)/2)
    ax.set_xlim(-10, x_rez(19) + 5)
    # axes = pylab.gca()
    # axes.set_aspect("equal")
    patch = plt.Circle((0, R), R, fill=False, color='r')
    patchC = plt.Circle((0, 0), 0.5,  fc='y')
    patchLine = plt.Line2D([0, 0], [R, 0], color="k")
    ani = FuncAnimation(fig, update,
                        frames=np.linspace(0, 19, 128),
                        blit=True,
                        interval=100,
                        init_func=init,
                        repeat=False)
    plt.show()
хочу сделать чтобы данные R и t можно было вводить с формы, и поместить этот график в виджет на форму. Но к сожалению ничего не получается.
 # -*- coding: utf-8 -*-
from PyQt5 import QtWidgets, QtCore
import aza_rc
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
class MyWindow(QtWidgets.QWidget, aza_rc.Ui_Form):
    def __init__(self, parent=None):
        super().__init__(parent, QtCore.Qt.Window)
        self.setupUi(self)
        self.fig, self.ax = plt.subplots()
        self.fig.set_size_inches(10, 5)
        self.canvas = FigureCanvas(self.fig)
        self.verticalLayout_2.addWidget(self.canvas)
        self.pushButton.clicked.connect(self.plot)
    def plot(self):
        ''' plot some random stuff '''
        self.canvas.draw()
Помогите, пожалуйста.

pyuser
Первая ссылка в google
PROkaZZZniK
pyuser
Первая ссылка в google
Спасибо, Вам, за отклик. Посмотрел, потыкался 2 дня, ничего не получилось(
PROkaZZZniK
Вроде бы что-то получается, но вылетают ошибки. Помогите исправить.

еще в файле azaxa.py
Функция plot, по клику на кнопку помещает canvas на виджет,
если повторно начать на кнопку, то добавляет еще один ниже. Как сделать так, чтобы первый затирался(удалялся)?
     def plot(self):
        self.canvas = GuiExample.CustomFigCanvas(self)
        self.verticalLayout_2.addWidget(self.canvas)
Спасибо.
PEHDOM
PROkaZZZniK
Как сделать так, чтобы первый затирался(удалялся)?
логично предположить что для того чтобы он удалялся его нужно удалять, для этого в компоновщике в противоположность методу addWidget()-который помещает виджет в компоновщик есть метод removeWidget() котороый удаляет виджет из компоновщика.
PROkaZZZniK
PEHDOM
removeWidget()
Да, то что и искал. А я все привязался и искал метод с clear…

Можете еще посмотреть так ли я закидываю график на форму?

Вылетают ошибки(но с ними анимация работает)
Traceback (most recent call last):
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 155, in __draw_idle_agg
self.draw()
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 128, in draw
self.update()
TypeError: update() missing 1 required positional argument: ‘frame’
Traceback (most recent call last):
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 155, in __draw_idle_agg
self.draw()
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 128, in draw
self.update()
TypeError: update() missing 1 required positional argument: ‘frame’
Traceback (most recent call last):
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 155, in __draw_idle_agg
self.draw()
File “C:\Python35-32\lib\site-packages\matplotlib\backends\backend_qt5agg.py”, line 128, in draw
self.update()
TypeError: update() missing 1 required positional argument: ‘frame’

Как я понимаю функции update() требуется аргумент ‘frame’, а я его не передаю?

Но я его передаю:
         FuncAnimation.__init__(self, self.fig,
                               self.update,
                               frames=np.linspace(0, 19, 128),
                               blit=True,
                               interval=50,
                               init_func=self.init,
                               repeat=False
                               )
frames=np.linspace(0, 19, 128),
PROkaZZZniK
Нашел проблему. Одноименный пользовательский метод.

Но у меня остался еще один вопрос.
С помощью matplotlib.animation можно сделать анимацию. Если выключить повтор, дождаться окончания анимации, и далее к примеру изменить масштаб окна, то нарисованный(ранее анимированный) график исчезает. Есть возможность его удержать?
PEHDOM
PROkaZZZniK
С помощью matplotlib.animation можно сделать анимацию. Если выключить повтор, дождаться окончания анимации, и далее к примеру изменить масштаб окна, то нарисованный(ранее анимированный) график исчезает. Есть возможность его удержать?
честно ХЗ, нужно пример перед собой иметь чтобы разобраться…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB