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()
¿Fue útil?

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
scroll top