1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
from multiprocessing import Process,Queue
from Tkinter import *
class Calculatrice:
def calc(self):
global entree
entree=Entry(f1,width=20)
entree.bind('<Return>',startCalc)
entree.grid()
def evaluate(self,expr):
"""Calcul dans un thread l'expression entrée"""
c,G,R,Na,k=299792458,6.67300e-11,8.314472,6.02214e23,9e8 # Définition des constantes
try:self.q.put([str(eval(expr)),''])
except:self.q.put(['',str(exc_info()[1])])
def startCalc(self,event=""):
"""Lance le calcul dans un thread (processus leger)"""
global varHist, histCalculs, nCalcul,sauvegarder_hst
if entree.get(): # On ne lance le calcul que si quelque chose a été entré
# Ajout à l'historique des expressions entrées
histCalculs.append(entree.get())
# On réinitialise le champ d'erreur et l'infobulle
self.label_erreur.configure(text='')
self.ib_erreur.label.configure(text='')
self.ib_erreur.texte=''
# On désactive le champ de texte pour que l'utilisateur ne puisse pas lancer un calcul pendant un autre calcul
entree.configure(state='disabled')
self.boutonCalcul.configure(text='Stop',command=self.stopCalc)
self.q=Queue()
self.calcul=Process(target=self.evaluate,args=(entree.get(),))
self.calcul.daemon=True
self.calcul.start()
entree.configure(state='normal')
if self.q.get()[0]!='': # Si aucune erreur n'est survenue pendant le calcul
entree.delete(0,'end')
entree.insert(0,self.q.get()[0])
varHist+=entree.get()+' = '+self.q.get()[0]+'\n' # Ajout à l'historique
else:
if not self.calcul.is_alive():self.q.put(['','Arrêt du calcul demandé'])
varHist+=entree.get()+' = '+self.q.get()[1]+'\n' # Ajout à l'historique
self.label_erreur.configure(text=self.q.get()[1],bg='#FF5050')
self.label_erreur.after(1000,lambda:self.label_erreur.configure(bg='#D9D9D9'))
if len(self.q.get()[1])>44:
self.ib_erreur.label.configure(text=self.q.get()[1])
self.ib_erreur.texte=self.q.get()[1]
nCalcul=len(histCalculs)
if sauvegarder_hst.get()==1:Historique().update_hst()
self.boutonCalcul.configure(text='Calculer',command=self.startCalc)
self.calcul.join() |
Partager