Desenho do gráfico Cosinus [duplicado]
-
21-12-2019 - |
Pergunta
Eu gostaria de fazer um programa que desenhasse um gráfico de cosseno em um intervalo ordenado.Mas há um erro que não consigo reparar.Mensagem de erro:"Erro de atributo:a instância do programa não possui atributo 'mp'" Aqui está meu código:
# -*- coding: utf-8 -*-
from Tkinter import Tk, W, E
from ttk import Label, Button, Frame, Entry,Style
import math
import sys
import matplotlib as mp
class program(Frame):
def __init__(self,main):
Frame.__init__(self,main)
self.main = main
self.initUI()
def initUI(self):
self.main.title('COSINUSEK')
Style().configure('TFrame', background = 'black')
Style().configure('TLabel', background = 'black', foreground = 'blue')
Style().configure("TButton", background = 'red', foreground = 'blue')
self.rowconfigure(0, pad = 3)
self.rowconfigure(1, pad = 3)
self.rowconfigure(2, pad = 3)
self.rowconfigure(3, pad = 3)
self.rowconfigure(4, pad = 3)
self.columnconfigure(0,pad =3)
self.columnconfigure(1,pad =3)
self.columnconfigure(2,pad =3)
self.columnconfigure(3,pad =3)
self.columnconfigure(4,pad =3)
label = Label(self, text = 'Give me range in degrees ').grid(row = 0,column = 3)
od = Label(self, text = ' From').grid(row = 1, column =0)
do = Label(self, text = ' To').grid(row = 1, column =4 )
self.entry = Entry(self, justify = 'center')
self.entry.grid(row = 2,column = 0,columnspan = 2 ,sticky = E+ W)
self.entry1 = Entry(self, justify = 'center')
self.entry1.grid(row = 2,column = 4,columnspan = 2, sticky = E)
button = Button(self, text = 'Ok',command = self.ok).grid(row = 3,column = 3)
button1 = Button(self, text = 'Draw', command = self.dra).grid(row = 4, column = 3)
self.pack()
def run(self):
self.main.mainloop()
def ok(self):
x = []
y = []
z = int(self.entry.get())
w = int(self.entry1.get())
i = w
while i in range(w,z):
x.append(i)
for a in x:
y[a] = math.cos((x[a]*math.pi)/180)
i = i + 0.01
def dra(self):
mp.ion()
mp.plot(self.x,self.y)
mp.title('Wykres')
mp.xlabel('x')
mp.ylabel('y')
mp.draw()
program(Tk()).run()
Solução
Você precisa usar um FigureCanvasTkAgg
widget para incorporar figuras matplotlib em uma GUI Tkinter.Há um exemplo nos documentos, aqui.
Aqui está uma pequena modificação em seu código, mostrando como você pode incorporar as alterações necessárias:
from Tkinter import Tk, W, E
from ttk import Label, Button, Frame, Entry, Style
import sys
import matplotlib.figure as mplfig
import matplotlib.backends.backend_tkagg as tkagg
import numpy as np
class program(Frame):
def __init__(self, main):
Frame.__init__(self, main)
self.main = main
self.initUI()
def initUI(self):
self.main.title('COSINUSEK')
Style().configure('TFrame', background='black')
Style().configure('TLabel', background='black', foreground='blue')
Style().configure("TButton", background='red', foreground='blue')
self.rowconfigure(0, pad=3)
self.rowconfigure(1, pad=3)
self.rowconfigure(2, pad=3)
self.rowconfigure(3, pad=3)
self.rowconfigure(4, pad=3)
self.columnconfigure(0, pad=3)
self.columnconfigure(1, pad=3)
self.columnconfigure(2, pad=3)
self.columnconfigure(3, pad=3)
self.columnconfigure(4, pad=3)
label = Label(self, text='Give me range in degrees ').grid(
row=0, column=3)
od = Label(self, text=' From').grid(row=1, column=0)
do = Label(self, text=' To').grid(row=1, column=4)
self.entry = Entry(self, justify='center')
self.entry.grid(row=2, column=0, columnspan=2, sticky=E + W)
self.entry1 = Entry(self, justify='center')
self.entry1.grid(row=2, column=4, columnspan=2, sticky=E)
button = Button(
self, text='Ok', command=self.ok).grid(row=3, column=3)
button1 = Button(
self, text='Draw', command=self.dra).grid(row=4, column=3)
self.fig = mplfig.Figure(figsize=(5, 4), dpi = 100)
self.ax = self.fig.add_subplot(111)
self.canvas = tkagg.FigureCanvasTkAgg(self.fig, self.main)
self.canvas.get_tk_widget().pack(side='top', fill='both', expand=1)
self.line = None
self.pack()
def run(self):
self.main.mainloop()
def ok(self):
z = int(self.entry.get())
w = int(self.entry1.get())
self.x = np.arange(z, w, 0.01)
self.y = np.cos((self.x * np.pi) / 180)
def dra(self):
self.ok()
if self.line is not None:
self.line.set_xdata(self.x)
self.line.set_ydata(self.y)
else:
self.line = self.ax.plot(self.x, self.y)[0]
self.ax.set_xlim(self.x.min(), self.x.max())
self.ax.relim()
self.ax.autoscale_view(True, True, True)
self.fig.canvas.draw()
program(Tk()).run()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow