AntonioVillanueva

Ecuacion 2° grado tkinter y matplot

Jul 24th, 2019
354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.39 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8
  3. """
  4. Antonio Villanueva Segura
  5. resolucion ecuacion de 2° grado en tkinter y Matplotlib
  6. pip3 install matplotlib
  7.  
  8. una referencia ecuacion de 2° grado
  9. https://www.geogebra.org/m/N9TyvDAb
  10. """
  11. import math
  12. import matplotlib
  13.  
  14. matplotlib.use("TkAgg")
  15. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
  16. from matplotlib.figure import Figure
  17.  
  18. from tkinter import*
  19. #*******************************************************************************
  20. """ parametros creacion de la ventana GUI y grafica ancho y alto """
  21. ANCHO=450
  22. ALTO=200
  23. #*******************************************************************************
  24. class MainApp():
  25.     """clase principal calculo raices de ecuacion de 2° grado ax^2+bx+c"""
  26.     def __init__(self,master):
  27.        
  28.         # variables a,b,c  ax²+bx+c con unos valores por defecto a=1,b=-5,c=4
  29.         self.a=StringVar(master,'1')
  30.         self.b=StringVar(master,'-5')
  31.         self.c=StringVar(master,'4')               
  32.        
  33.         #tkinter GUI grafico
  34.         self.master=master
  35.        
  36.         master.title("Ecuacion 2° grado completa !.     Antonio Villanueva")
  37.         master.geometry("{}x{}".format(ANCHO,ALTO))
  38.         master.resizable(0,False)
  39.        
  40.         #Etiquetas valores polinomio a,b,c
  41.         self.Labela= Label(master, text="a=")
  42.         self.Labela.place(x=0,y=2)
  43.        
  44.         self.Labelb= Label(master, text="b=")
  45.         self.Labelb.place(x=0,y=72)    
  46.  
  47.         self.Labelc= Label(master, text="c=")
  48.         self.Labelc.place(x=0,y=142)
  49.        
  50.         self.Labelec= Label(master, text=" ax^2+bx+c ")
  51.         self.Labelec.place(x=90,y=73)
  52.        
  53.         #Entradas a,b,c valores polinomio
  54.         self.aa=Entry(master,textvariable=self.a,bd=2,width=7)
  55.         self.aa.place(x=14,y=2)
  56.        
  57.         self.bb=Entry(master,textvariable=self.b,bd=2,width=7)
  58.         self.bb.place(x=14,y=72)
  59.        
  60.         self.cc=Entry(master,textvariable=self.c,bd=2,width=7)
  61.         self.cc.place(x=14,y=142)
  62.  
  63.         #Boton =  calculo
  64.         self.btnclean=Button(master,text=" = ",command=self.calcula)
  65.         self.btnclean.place(x=260,y=70)        
  66.        
  67.         #Salidas resultados ,soluciones raices
  68.         self.raiz=Listbox(master,bd=5,width=15,height=2,justify='center')
  69.         self.raiz.place(x=310,y=66)            
  70.        
  71.     def recupera(self):
  72.         """ recupera los valores str en las entradas a las variables a,b,c"""
  73.         self.a=int(self.aa.get())
  74.         self.b=int(self.bb.get())
  75.         self.c=int(self.cc.get())              
  76.                
  77.     def calcula(self):
  78.         """calcula las raices de la ecuacion de 2° grado completa c!=0 """
  79.         imaginaria=False #Detecta raices imaginarias cuando det. es negativo
  80.        
  81.         self.recupera() #recupera valores variables
  82.         discriminante = self.b**2 - (4*self.a * self.c)
  83.        
  84.         if discriminante<0 :#solucion imaginaria i
  85.             imaginaria=True
  86.             discriminante=abs(discriminante)
  87.                    
  88.         #Los dos bloques de la ecuacion
  89.         try:
  90.             bloqueA= round (- self.b / (2* self.a) ,4) #redondea a 4 dec.
  91.         except ZeroDivisionError:
  92.             self.raiz.insert(0,"Error Division por 0")
  93.             return -1 #Division por cero salimos de aqui
  94.        
  95.         #discriminante/2*a
  96.         bloqueB= round (math.sqrt(abs(discriminante)) / (2* self.a),4   )
  97.         print ("Bloque b ",bloqueB)
  98.        
  99.         #Insertar raices , soluciones en el Listbox
  100.         if not imaginaria:#Solucion Real
  101.             self.raiz.insert(0,bloqueA+bloqueB)
  102.             self.raiz.insert(1,bloqueA-bloqueB)    
  103.         else:#Solucion imaginaria
  104.             self.raiz.insert(0,str(bloqueA)+'+'+str(bloqueB)+' i')
  105.             self.raiz.insert(1,str(bloqueA)+'-'+str(bloqueB)+' i') 
  106.        
  107.         #Llama a la clase de representacion Grafica del polinomio e indica sus raices          
  108.         Graficos(Tk(),self.a,self.b,self.c,bloqueA+bloqueB,bloqueA-bloqueB)#Tk() Tk() self.master misma ventana
  109.        
  110. #*******************************************************************************
  111. class Graficos():
  112.     """Clase para graficar el polinomio """
  113.     def __init__(self, parent,a,b,c,raiz1,raiz2):
  114.  
  115.         self.parent=parent
  116.         #parametros a,b,c en ax^2+bx+c
  117.         self.a=a
  118.         self.b=b
  119.         self.c=c
  120.        
  121.         #Raices calculadas en MainApp
  122.         self.raiz1=raiz1
  123.         self.raiz2=raiz2
  124.        
  125.         #Listas ,con las coordenadas x,y del punto  y se calcula en ecuacion
  126.         self.x=[]
  127.         self.y=[]
  128.        
  129.         #Ventana Grafica
  130.         parent.title("Grafico ecuacion 2° grado")
  131.         parent.geometry("{}x{}".format(ANCHO*2,ALTO*2))
  132.         parent.resizable(0,False)      
  133.  
  134.         #Crea puntos y grafica
  135.         self.puntos() #Crea los pares de puntos x,y
  136.        
  137.         figura = Figure(figsize=(10,10), dpi=100)#figsize width, height , dpi resolution  figure
  138.         dibujo = figura.add_subplot(111) #111 significa una rejilla de 1x1  
  139.         dibujo.plot(self.x,self.y)# x e y  
  140.        
  141.         #Muestra raices de la ecuacion en cuadrado rojo
  142.         dibujo.text(raiz1, 0, str(raiz1)+',0', fontsize=10,rotation=90, bbox=dict(facecolor='red', alpha=0.5))
  143.         dibujo.text(raiz2, 0, str(raiz2)+',0', fontsize=10, rotation=90 ,bbox=dict(facecolor='red', alpha=0.5))    
  144.    
  145.         canvas = FigureCanvasTkAgg(figura, self.parent)
  146.         canvas.draw()        
  147.         canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)  
  148.                        
  149.     def puntos(self):
  150.         """crea los puntos de la grafica """
  151.         self.x= [i for i in range(-20,20)]#inicializa las x
  152.  
  153.         for xx in self.x:#Recorre los puntos en X
  154.             self.y.append(self.ecuacion(xx))#Encuentra el punto Y
  155.            
  156.     def ecuacion(self,x):
  157.         """devuelve la coordenada en y en la grafica """
  158.         return self.a* (x**2) +self.b*(x)+self.c  
  159.        
  160. #*******************************************************************************
  161. if __name__=="__main__":
  162.     """Bucle principal """
  163.     base=Tk()#introduccion variables y resolucion raices
  164.     Principal=MainApp(base)
  165.     base.mainloop()
Add Comment
Please, Sign In to add comment