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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
def var(variable,value):
"""Crée une variable globale"""
if not variable in globals():
cfg.set("Vars",variable,value)
cfg.write(open('.calculatrice/preferences.cfg','w'))
variables[variable]=value
return variable+'='+str(value)
else:raise ValueError(_("Ce nom de variable n'est pas disponible"))
def rmvar(*var):
"""Supprime une variable créée"""
for variable in var:
cfg.remove_option("Vars",variable)
cfg.write(open('.calculatrice/preferences.cfg','w'))
del variables[variable]
return ""
def vars():
"""Retourne les variables globales enregistrées"""
return variables
class Calculatrice:
def calc(self):
"""Affichage de la calculatrice"""
global entree,unite,f1
try:f1.destroy()
except:pass
f1=Frame(f)
self.f2=Frame(f1)
entree=Entry(self.f2,width=25,justify='right')
entree.bind("<<Action>>",self.startCalc)
entree.bind('<Escape>',self.stopCalc)
entree.grid(row=0,column=1)
self.f2.grid()
f1.grid()
def startCalc(self,event=""):
"""Lance le calcul dans un processus"""
def evaluate(expression,resultat):
global variables
"""Calcule dans un processus l'expression et renvoie le résultat
resultat[0] renvoie False si erreur de calcul
resultat[1] renvoie le resultat ou l'erreur selon resultat[0]"""
c,G,R,Na,k=299792458,6.67300e-11,8.314472,6.02214e23,9e8 # Définition des constantes
try:
resultat[1]=str(eval(expression,globals(),variables))
resultat[0]=True
except:
resultat[1]=str(sys.exc_info()[1])
resultat[0]=False
if entree.get().strip(): # On ne lance le calcul que si l'entrée n'est pas vide
self.arretdemande = False
self.resultat = Manager().dict()
self.resultat[0] = None
self.expr=entree.get()
self.calcul = Process(target=evaluate,args=(self.expr,self.resultat))
self.calcul.start()
histCalculs.append(entree.get()) # Ajout à l'historique des expressions entrées
entree.configure(state='disabled') # On désactive le champ de texte pour que l'utilisateur ne puisse pas lancer un calcul pendant un autre calcul
# 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=''
self.boutonCalcul.configure(text='Stop',command=self.stopCalc)
f1.after_idle(self.affiche)
def affiche(self):
global varHist,histCalculs,nCalcul,sauvegarder_hst
if not self.calcul.is_alive(): # affiche le résultat s'il est disponible
entree.configure(state='normal')
if self.arretdemande:
self.resultat[0]=False
self.resultat[1]=_("Arrêt du calcul demandé")
if self.resultat[0]: # pas d'erreur de calcul => afficher le résultat
entree.delete(0,'end')
entree.insert(0,self.resultat[1])
else: # afficher l'erreur de calcul
self.label_erreur.configure(text=_("Erreur: ")+self.resultat[1],bg='#FF5050')
self.label_erreur.after(1000,lambda:self.label_erreur.configure(bg='#D9D9D9'))
if len(self.resultat[1])>44:
self.ib_erreur.label.configure(text=self.resultat[1])
self.ib_erreur.texte=self.resultat[1]
varHist+=self.expr+' = '+self.resultat[1]+'\n' # Ajout à l'historique
nCalcul=len(histCalculs)
if sauvegarder_hst.get()==1:Historique().update_hst()
self.boutonCalcul.configure(text=_('Calculer'),command=self.startCalc)
else:f1.after_idle(self.affiche)
variables={}
# Chargement / Création du fichiers des parametres
cfg=RawConfigParser()
try:
cfg.read('.calculatrice/preferences.cfg')
unite=IntVar(value=cfg.getint('Config','unite'))
sauvegarder_hst=BooleanVar(value=cfg.getboolean('Config','sauvegarder_hst'))
for variable in cfg.options("Vars"):
try:variables[variable]=cfg.getfloat('Vars',variable) # Variables numériques => float
except:variables[variable]=cfg.get('Vars',variable) # Variables str
except:
cfg.add_section('Config')
cfg.set('Config','sauvegarder_hst','1')
cfg.set('Config','unite','1')
cfg.add_section('Vars')
cfg.write(open('.calculatrice/preferences.cfg','w'))
unite=IntVar(value=1)
sauvegarder_hst=BooleanVar(value=1) |
Partager