Dibujo del gráfico de coseno [duplicado]
-
21-12-2019 - |
Pregunta
Me gustaría crear un programa que dibuje un gráfico coseno en un rango ordenado.Pero hay un error que no puedo reparar.Mensaje de error:"Error de atributo:la instancia del programa no tiene el atributo 'mp'". Aquí está mi 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()
Solución
Necesitas usar un FigureCanvasTkAgg
widget para incrustar figuras matplotlib en una GUI de Tkinter.Hay un ejemplo en los documentos, aquí.
Aquí hay una ligera modificación de su código, que muestra cómo podría incorporar los cambios necesarios:
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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow