Outils pour utilisateurs

Outils du site


teaching:progappchim:ph_courbe_titrage_2011

Différences

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

Lien vers cette vue comparative

teaching:progappchim:ph_courbe_titrage_2011 [2014/02/11 08:52] (Version actuelle)
villersd créée
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: 2014/02/11 08:52 par villersd