Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- # -*- coding: utf-8
- """
- Antonio Villanueva Segura
- resolucion ecuacion de 2° grado en tkinter y Matplotlib
- pip3 install matplotlib
- una referencia ecuacion de 2° grado
- https://www.geogebra.org/m/N9TyvDAb
- """
- import math
- import matplotlib
- matplotlib.use("TkAgg")
- from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
- from matplotlib.figure import Figure
- from tkinter import*
- #*******************************************************************************
- """ parametros creacion de la ventana GUI y grafica ancho y alto """
- ANCHO=450
- ALTO=200
- #*******************************************************************************
- class MainApp():
- """clase principal calculo raices de ecuacion de 2° grado ax^2+bx+c"""
- def __init__(self,master):
- # variables a,b,c ax²+bx+c con unos valores por defecto a=1,b=-5,c=4
- self.a=StringVar(master,'1')
- self.b=StringVar(master,'-5')
- self.c=StringVar(master,'4')
- #tkinter GUI grafico
- self.master=master
- master.title("Ecuacion 2° grado completa !. Antonio Villanueva")
- master.geometry("{}x{}".format(ANCHO,ALTO))
- master.resizable(0,False)
- #Etiquetas valores polinomio a,b,c
- self.Labela= Label(master, text="a=")
- self.Labela.place(x=0,y=2)
- self.Labelb= Label(master, text="b=")
- self.Labelb.place(x=0,y=72)
- self.Labelc= Label(master, text="c=")
- self.Labelc.place(x=0,y=142)
- self.Labelec= Label(master, text=" ax^2+bx+c ")
- self.Labelec.place(x=90,y=73)
- #Entradas a,b,c valores polinomio
- self.aa=Entry(master,textvariable=self.a,bd=2,width=7)
- self.aa.place(x=14,y=2)
- self.bb=Entry(master,textvariable=self.b,bd=2,width=7)
- self.bb.place(x=14,y=72)
- self.cc=Entry(master,textvariable=self.c,bd=2,width=7)
- self.cc.place(x=14,y=142)
- #Boton = calculo
- self.btnclean=Button(master,text=" = ",command=self.calcula)
- self.btnclean.place(x=260,y=70)
- #Salidas resultados ,soluciones raices
- self.raiz=Listbox(master,bd=5,width=15,height=2,justify='center')
- self.raiz.place(x=310,y=66)
- def recupera(self):
- """ recupera los valores str en las entradas a las variables a,b,c"""
- self.a=int(self.aa.get())
- self.b=int(self.bb.get())
- self.c=int(self.cc.get())
- def calcula(self):
- """calcula las raices de la ecuacion de 2° grado completa c!=0 """
- imaginaria=False #Detecta raices imaginarias cuando det. es negativo
- self.recupera() #recupera valores variables
- discriminante = self.b**2 - (4*self.a * self.c)
- if discriminante<0 :#solucion imaginaria i
- imaginaria=True
- discriminante=abs(discriminante)
- #Los dos bloques de la ecuacion
- try:
- bloqueA= round (- self.b / (2* self.a) ,4) #redondea a 4 dec.
- except ZeroDivisionError:
- self.raiz.insert(0,"Error Division por 0")
- return -1 #Division por cero salimos de aqui
- #discriminante/2*a
- bloqueB= round (math.sqrt(abs(discriminante)) / (2* self.a),4 )
- print ("Bloque b ",bloqueB)
- #Insertar raices , soluciones en el Listbox
- if not imaginaria:#Solucion Real
- self.raiz.insert(0,bloqueA+bloqueB)
- self.raiz.insert(1,bloqueA-bloqueB)
- else:#Solucion imaginaria
- self.raiz.insert(0,str(bloqueA)+'+'+str(bloqueB)+' i')
- self.raiz.insert(1,str(bloqueA)+'-'+str(bloqueB)+' i')
- #Llama a la clase de representacion Grafica del polinomio e indica sus raices
- Graficos(Tk(),self.a,self.b,self.c,bloqueA+bloqueB,bloqueA-bloqueB)#Tk() Tk() self.master misma ventana
- #*******************************************************************************
- class Graficos():
- """Clase para graficar el polinomio """
- def __init__(self, parent,a,b,c,raiz1,raiz2):
- self.parent=parent
- #parametros a,b,c en ax^2+bx+c
- self.a=a
- self.b=b
- self.c=c
- #Raices calculadas en MainApp
- self.raiz1=raiz1
- self.raiz2=raiz2
- #Listas ,con las coordenadas x,y del punto y se calcula en ecuacion
- self.x=[]
- self.y=[]
- #Ventana Grafica
- parent.title("Grafico ecuacion 2° grado")
- parent.geometry("{}x{}".format(ANCHO*2,ALTO*2))
- parent.resizable(0,False)
- #Crea puntos y grafica
- self.puntos() #Crea los pares de puntos x,y
- figura = Figure(figsize=(10,10), dpi=100)#figsize width, height , dpi resolution figure
- dibujo = figura.add_subplot(111) #111 significa una rejilla de 1x1
- dibujo.plot(self.x,self.y)# x e y
- #Muestra raices de la ecuacion en cuadrado rojo
- dibujo.text(raiz1, 0, str(raiz1)+',0', fontsize=10,rotation=90, bbox=dict(facecolor='red', alpha=0.5))
- dibujo.text(raiz2, 0, str(raiz2)+',0', fontsize=10, rotation=90 ,bbox=dict(facecolor='red', alpha=0.5))
- canvas = FigureCanvasTkAgg(figura, self.parent)
- canvas.draw()
- canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)
- def puntos(self):
- """crea los puntos de la grafica """
- self.x= [i for i in range(-20,20)]#inicializa las x
- for xx in self.x:#Recorre los puntos en X
- self.y.append(self.ecuacion(xx))#Encuentra el punto Y
- def ecuacion(self,x):
- """devuelve la coordenada en y en la grafica """
- return self.a* (x**2) +self.b*(x)+self.c
- #*******************************************************************************
- if __name__=="__main__":
- """Bucle principal """
- base=Tk()#introduccion variables y resolucion raices
- Principal=MainApp(base)
- base.mainloop()
Add Comment
Please, Sign In to add comment