Cosinus图形绘图

时间:2013-11-17 12:37:10

标签: python graph matplotlib tkinter ttk

我想制作一个程序,在有序范围内绘制一个cosinus图。但是有一个我无法修复的错误。错误消息:“AttributeError:程序实例没有属性'mp'”这是我的代码:

# -*- 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()

1 个答案:

答案 0 :(得分:1)

您需要使用FigureCanvasTkAgg小部件在Tkinter GUI中嵌入matplotlib数字。有example in the docs, here

以下是对代码的轻微修改,说明如何合并所需的更改:

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()