====== Courbe de Prédominance d'un Acide ====== #!/usr/bin/env python # -*- coding: utf-8 -*- # travail de KH, ba2 chimie 2012-2013 # Courbe de Prédominance d'un Acide # from math import * import matplotlib.pyplot as plt from Tkinter import * def equations (n,C,a,b,c,d,e,f,g,pKa1,pKa2,pKa3): #initialiser (valeur 0) pH = 0. #pH de départ if n==3: Ka1=10**(-pKa1) Ka2=10**(-pKa2) Ka3=10**(-pKa3) while pH < 14: #pH va jusque 14 H = 10**(-pH) #équation pour avoir les concentrations en H30+ aux différents pH demandé O = (10**(-14)) / H #équation pour avoir les concentrations en OH- aux différents pH demandé K = 1 + H/Ka3 + (H**2)/(Ka2*Ka3) + (H**3)/(Ka1*Ka2*Ka3) #équation qui détermine la valeur de alpha H a0= 1/K # équation pour avoir alpha0 a1=a0*(H/Ka3) # équation pour avoir alpha1 a2=a1*(H/Ka2) # équation pour avoir alpha2 a3=a2*(H/Ka1) # équation pour avoir alpha3 H3Y = a3 * C # équation pour avoir la [H3Y] H2Y = a2 * C # équation pour avoir la [H2Y-] HY2 = a1 * C # équation pour avoir la [HY2-] Y3 = a0 * C # équation pour avoir la [Y3-] # listes auxquels nous ajouterons les différentes valeurs calculées au dessus pour chaque pH demandé : a.append(pH) b.append (H) c.append (O) d.append (H3Y) e.append (H2Y) f.append (H2Y) g.append (Y3) pH = pH + 0.1 elif n==2: Ka1=10**(-pKa1) Ka2=10**(-pKa2) while pH < 14: H = 10**(-pH) #équation pour avoir les concentration en H3O+ aux différents pH demandé O = (10**(-14)) / H # équation pour avoir les concentration en OH - aux différents pH demandé K = 1 + H/Ka2 + (H**2)/(Ka2*Ka1) #équation pour avoir la valeur de alpha H a0 = 1/K #équation pour avoir alpha 0 a1= a0*(H/Ka1) #équation pour avoir alpha 1 a2 = a1*(H/Ka1) #équation pour avoir alpha 2 H2Y = a2*C #équation pour avoir la [H2Y] HY=a1*C #équation pour avoir la [HY-] Y2=a0*C # équation pour avoir la [Y2-] # listes auxquels nous ajouterons les différentes valeurs calculées au dessus pour chaque pH demandé : a.append(pH) b.append(H) c.append(O) d.append(H2Y) e.append(HY) f.append(Y2) pH = pH + 0.1 elif n==1: Ka1=10**(-pKa1) while pH < 14 : H = 10**(-pH) #équation pour avoir les concentration en H3O+ aux différents pH demandé O = (10**(-14)) / H # équation pour avoir les concentration en OH - aux différents pH demandé K = 1 + H/Ka1 #équation pour avoir la valeur de alpha H a0 = 1/K #équation pour avoir alpha 0 a1= a0*(H/Ka1) #équation pour avoir alpha 1 HY= a1*C #équation pour avoir la [HY] Y=a0*C #équation pour avoir la [Y-] # listes auxquels nous ajouterons les différentes valeurs calculées au dessus pour chaque pH demandé : a.append(pH) b.append (H) c.append (O) d.append (HY) e.append (Y) pH = pH + 0.1 #2eme fenêtre dans laquelle on rentrera les paramètres propre à la molécule étudiée. def fenetre2(): root2 = Tk() n = float (champn.get ()) # transformation en nombre flottant de la valeur entrée pour n txtn = Label(root2, text ='pKa1 : ', fg = 'red') txtn.grid(row=2) champ1 = Entry(root2) #demander le pKa1 champ1.grid(row=3) # ligne à laquelle apparaitra le champs ou l'on donnera le pKa1 if n > 1 : #paramètre demander si la molécule possède 2 H+ txt2 = Label(root2, text ='pKa2 : ', fg = 'red') txt2.grid(row=4) champ2 = Entry (root2) #demande le pKa2 champ2.grid(row=5) # ligne à laquelle apparaitra le champs ou l'on donnera le pKa2 if n == 3 : #paramètre demander si la molécule possède 3 H+ txt3 = Label(root2, text ='pKa3 : ', fg = 'red') txt3.grid(row=6) champ3 = Entry (root2) #demande le pKa3 champ3.grid(row=7) #ligne à laquelle apparaitra le champs dans lequel on donnera le pKa3 def graphe(): a=[] b=[] c=[] d=[] e=[] f=[] g=[] n = float(champn.get()) C = float(champc.get()) pKa1 = float(champ1.get()) pKa2 = 0 pKa3 = 0 if n > 1: pKa2 = float (champ2.get()) if n == 3: pKa3 = float (champ3.get()) equations(n,C,a,b,c,d,e,f,g,pKa1 = pKa1, pKa2 = pKa2, pKa3 = pKa3) plt.xlabel("pH") #nom donné à l'axe des abscisses plt.ylabel("Concentrations") #nom donné à l'axe des ordonnées # les différentes droites qui seront présentes sur le graphique semilog : c1 = plt.semilogy(a,b,'r') #courbe donnant le concentration en H3O+ en fonction du pH c2 = plt.semilogy(a,c, 'b') #courbe donnant le concentration en OH- en fonction du pH c3 = plt.semilogy(a,e,'g') #courbe donnant le concentration en l'acide qui à tout ces H+ en fonction du pH c4 = plt.semilogy(a,d,'m') if len(f)>1: c5 = plt.semilogy(a,f,'c') #courbe donnant le concentration en l'acide qui a perdu 2H+ en fonction du pH if len(g)>1: c6 = plt.semilogy(a,g,'y') #courbe donnant le concentration en l'acide qui a perdu 3H+ en fonction du pH plt.title("Courbe representant la predominance") plt.show() b2=Button(root2,text="Tracer le Graphique",command=graphe, bg = 'black', fg = 'red') #bouton qui tracera la courbe de prédominance de l'acide choisit. b2.grid(row=8) #ligne à laquelle se situe le bouton2 bfin=Button(root2,text="Quitter",command=root2.quit, bg ='green', fg = 'blue') bfin.grid(row=9) #ligne à laquelle se trouve le bouton de fin. root2.mainloop() # éliminer la fenêtre : root2.destroy() #fenêtre n°1 dans laquelle on donnera le nombre de proton de la molécule afin de pouvoir donner les valeurs nécessaires à ceux-ci. root1= Tk() txtn = Label(root1, text = "Combien de proton peut perdre la molecule ?", fg = 'red') txtn.grid(row=0) champn=Entry(root1) #demande le nombre de H+ de la molécule (1, 2 ou 3) champn.grid(row=1) #ligne à laquelle apparaitra le champ à complèter txtc = Label(root1, text = "Concentration (mol/L) :", fg ='orange') txtc.grid(row=2) champc = Entry(root1) #demande la concentration de la molécule. champc.grid(row=3) #ligne à laquelle apparaîtra le champ où l'on donnera la concentration b1 = Button(root1, text = 'Valeurs des pKa ?',command = fenetre2,fg = 'red', bg = 'black') #bouton qui ouvrira la fenêtre n°2 afin de rentrer les autres paramètres. b1.grid(row = 4) b2 = Button(root1, text = 'Quitter', command = root1.quit,fg = 'red', bg = 'black') b2.grid (row = 5) root1.mainloop() # éliminer la fenêtre : root1.destroy() #Référence: # http://w3.umons.ac.be/perso/Villers.Didier/wiki/doku.php?id=floss:python # http://www.siteduzero.com/informatique/python/tutoriels # https://moodle.umons.ac.be/course/view.php?id=107 # http://www.inforef.be/swi/download/apprendre_python3.pdf