teaching:progappchim:ph_courbe_titrage_2011

no way to compare when less than two revisions

Différences

Ci-dessous, les différences entre deux révisions de la page.


Dernière révision
teaching:progappchim:ph_courbe_titrage_2011 [2014/02/11 08:52] – créée villersd
Ligne 1: Ligne 1:
 +====== pH et courbe de titrage ======
 +<sxh python; title : pH_courbe_titrage.py>
 +#!/usr/bin/env python
 +# -*- coding: utf-8 -*-
 +# Programme de calculs de pH et de courbes de titrages
 +# AD & BW, Ba2 chimie 2010-2011
  
 +from math import * 
 +from Tkinter import * 
 +import matplotlib.pyplot as plt
 +import numpy as np              
 +
 +def pol():                            #on définit la fonction pour le bouton "Calcul du pH"
 +    try:
 +        ca = e0.get()                 #permet de récupérer les valeurs entrées dans les champs d'entrée par l'utilisateur
 +        pka =e1.get()
 +        equation_index = myvar.get()  #permet de déterminer quel radioboutton est sélectionné
 +        if equation_index == 0:       #si aucun des radios bouttons n'est sélectionné on crée une fonction ouvrant une fenêtre d'avertissement
 +            fenwarn = Toplevel(fen1)
 +            fenwarn.title('Erreur')
 +            Label(fenwarn, text='Vous devez choisir un type').pack(padx=5, pady=5)
 +            Button(fenwarn, text='Fermer', command = fenwarn.destroy,bg="red").pack(padx=5, pady=5)
 +            return
 +        elif equation_index == 1:     #valeur attribuée aux différents radio bouttons
 +            rep=0.5*(float(pka))-0.5*log10(float(ca))
 +        elif equation_index == 2:
 +            rep=7+0.5*(float(pka))+0.5*log10(float(ca))
 +        elif equation_index == 3:
 +            rep=-log10(float(ca))
 +        elif equation_index == 4:
 +            rep=14+log10(float(ca))
 +        if rep<0 or rep>14:
 +            fenwarn = Toplevel(fen1)
 +            fenwarn.title('Erreur'
 +            Label(fenwarn, text="Veuillez entrer des valeurs cohérentes. Le pH doit-être compris entre 0 et 14").pack(padx=5, pady=5)
 +            Button(fenwarn, text='Fermer', command = fenwarn.destroy,bg="red").pack(padx=5, pady=5)
 +            print "Attention!!! Le ph n'est pas compris entre 0 et 14"
 +            return
 +            
 +    except ValueError, TypeError:
 +        fenwarn = Toplevel(fen1)
 +        fenwarn.title('Erreur'
 +        Label(fenwarn, text="Veuillez entrer une donnée cohérente!").pack(padx=5, pady=5)
 +        Label(fenwarn, text="Si cette dernière est décimale, n'oubliez pas le point à la place de la virgule").pack(padx=5, pady=5)
 +        Button(fenwarn, text='Fermer', command = fenwarn.destroy,bg="red").pack(padx=5, pady=5)
 +        print """Veuillez entrer une donnée cohérente.\nSi cette dernière est décimale, n'oubliez pas le point à la place de la virgule"""  #coller Si au /n sinon, on a un espace qui se met dans l'interpréateur.
 +    else:
 +        print"Voici le resultat, pour une concentration de",ca, "mol/l et un pka de",pka," le ph est de",rep #on imprime la réponse dans le mode interactif
 +        Result['text'] = "Resultat : " + str(rep)
 +
 +def graphe():
 +    x=np.arange(0,50)
 +    y=((5*(1/(0.5+e**-(x-25))))+1)
 +    plt.plot(x,y)
 +    plt.xlim(0,50)
 +    plt.ylim(0,14)
 +    plt.ylabel('pH')
 +    plt.xlabel("Volume"                                                   
 +    plt.suptitle("Exemple de courbe de titrage: titrage d'un acide fort par une base forte")
 +    plt.show()
 +
 +def bye():                          #fonction du bouton Fermer qui ferme la fenêtre
 +    print "Merci d'avoir utilisé notre programme, à la prochaine!"
 +    fen1.destroy()
 +
 +def titrage():                      #fonction du bouton Courbe de titrage
 +    fen = Toplevel(fen1)
 +    fen.title('Courbe de titrage')
 +    Button(fen, text='Fermer', command = fen.destroy,bg="red").pack(padx=5, pady=5)  
 +
 +fen1 = Tk()    
 +fen1.title("Calculs de pH")
 +
 +#création des différents widgets (Radioboutons, boutons, champs d'entrée)
 +
 +myvar= IntVar()
 + 
 +Label(fen1, text="Quel est le type de l'espèce considérée ?").grid(row=0, column=1, columnspan=2, padx=5, pady=5)
 +Radiobutton(fen1,text="Acide faible", variable=myvar, value=1, indicatoron=0, bg="red", fg="black").grid(row=1, column=1, padx=5, pady=5, ipady=5, sticky=W+E)
 +Radiobutton(fen1,text="Base faible ", variable=myvar, value=2, indicatoron=0, bg="blue", fg="cyan").grid(row=2, column=1, padx=5, pady=5, ipady=5, sticky=W+E)
 +Radiobutton(fen1,text="Acide fort", variable=myvar, value=3, indicatoron=0, bg="red", fg="black").grid(row=1, column=2, padx=5, pady=5, ipady=5, sticky=W+E)
 +Radiobutton(fen1,text="Base forte", variable=myvar, value=4, indicatoron=0, bg="blue", fg="cyan").grid(row=2, column=2, padx=5, pady=5, ipady=5, sticky=W+E)
 +
 +Label(fen1, text="Concentration de l'espèce en question (en mol/l) :").grid(row=0, column=3, padx=5, pady=5)
 +e0=Entry(fen1, width=20, justify=CENTER)
 +e0.grid(row=1, column=3)
 +Label(fen1, text="pka ?").grid(row=2, column=3)
 +e1=Entry(fen1, width=20, justify=CENTER)
 +e1.grid(row=3, column=3)
 +
 +Button(fen1, text="Calcul du pH", command=pol, bg="green", fg="black", relief=GROOVE).grid(row=4, column=3, pady=15)
 +Button(fen1, text="Quitter", command=bye, bg="red").grid(row=9, column=1, columnspan=3, padx=5, pady=5)
 +Button(fen1, text="Courbe de titrage", command=graphe, bg="black", fg="white").grid(row=4, column=1,columnspan=2, padx=5, pady=5)
 +
 +#création d'un widget 'Canvas' contenant une image bitmap :
 +
 +can1 = Canvas(fen1, width =370, height =600, bg ='white')
 +photo = PhotoImage(file ='216_pH_Scale-01.gif')
 +item = can1.create_image(185, 300, image =photo)
 +can1.grid(row=5, columnspan=5, padx=10, pady=10)
 +
 +#création de ligne de séparation
 + 
 +Frame(fen1, height=2, bd=1, relief=SUNKEN).grid(row=6, column=1, columnspan=3, padx=5, pady=5, sticky=W+E)
 +Frame(fen1, height=2, bd=1, relief=SUNKEN).grid(row=8, column=1, columnspan=3, padx=5, pady=5, sticky=W+E)
 +
 +#emplacement du résultat
 +
 +Result = Label(fen1, text="Résultat :", justify=CENTER)
 +Result.grid(row=7, column=1, columnspan=3, padx=5, pady=5, sticky=W+E)
 +
 +#exécution du programme
 +
 +fen1.mainloop()
 +
 +#Sources
 +#http://matplotlib.sourceforge.net/
 +#http://www.scipy.org/Plotting_Tutorial
 +#http://www.pythonware.com/library/tkinter/introduction/
 +#http://gnuprog.info/prog/python/pwidget.php
 +#http://www.inforef.be/swi/python.htm (PDF Swinnen)
 +#http://en.wikipedia.org/wiki/File:216_pH_Scale-01.jpg <-- image remplaçant celle proposée par les étudiants
 +</sxh>
 +
 +**Image utilisée :**
 +
 +{{:teaching:progappchim:216_ph_scale-01.gif|}}
  • teaching/progappchim/ph_courbe_titrage_2011.txt
  • Dernière modification : 2021/03/11 17:53
  • de villersd