Accueil » Python » Forums Python » Forum général Python » Info: une calculatrice graphique facilement extensible

 • Info: une calculatrice graphique facilement extensible

Document Actions
Réponses: 7   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

 • Info: une calculatrice graphique facilement extensible

Posté par tyrtamos le 12/11/2007 07:32
Bonjour,

J'avais entrepris il y a quelques semaines la réalisation d'une calculatrice graphique extensible en python, et ce forum m'a aidé à 2 reprises.

Pour ceux que ça intéresse, le résultat est là:

http://linux.jpvweb.com/mesrecetteslinux/doku.php?id=calculatrice

J'ai découvert à cette occasion pas mal de possibilités étonnantes de python, et cela donne un outil bureautique assez pratique (je l'ai d'abord fait pour moi), qui de plus fonctionne de façon identique (et c'est le même code) sous Windows et sous Linux:

- calculs courants

- calculs trigonométriques

- calculs en entier long

- calculs de conversion décimal-> binaire et binaire -> décimal, y compris de binaires signés avec des mots de longueur quelconque

- calculs arithmétiques: pgcd, ppcm, décomposition en facteurs premiers, recherche de nombres premiers, ...

- calculs d'analyse combinatoire: permutations, combinaisons, arrangements

- calculs de probabilité: loi binomiale, hypergéométrique, probabilité gaussienne

- calculs de crédits bancaires

- calculs de dates et d'heures: heure de l'ordinateur, heure exacte par consultation d'un serveur NTP, jour de la semaine, différence entre 2 dates, dates de Pâques, jours fériés France, ...

Bon, je ne suis toujours pas expert en python (c'est mon 1er programme), et ce n'est probablement pas le meilleur code python qu'on ait écrit, mais ça fonctionne assez bien. Je reste cependant à l'écoute des éventuelles critiques et propositions.

Je pense que le moteur de la calculette est assez stable maintenant, et que les développements suivants concerneront surtout de nouvelles fonctions et de nouveaux modules.

En espérant que ça sera utile à quelqu'un (et qu'il s'amusera autant que moi :) )

Tyrtamos

 • Re: Info: une calculatrice graphique facilement extensible

Posté par tyrtamos le 16/11/2007 11:15
Deux petits additifs à la version 1.2 qui passe à la 1.21:

Un petit ajout qui a de grosses conséquences sur la facilité d'utilisation: un clic droit sur la zone de saisie affiche un menu flottant (pop-up) à deux niveaux qui donne la liste des fonctions disponibles.

Ce menu a 2 avantages:

- il rappelle toutes les fonctions disponibles, y compris celles ajoutées (il est facile à mettre à jour par l'utilisateur)

- il insère la fonction sélectionnée à l'emplacement du curseur de la zone de saisie: l'utilisateur n'a donc plus besoin de taper les fonctions au clavier!


Un autre ajout: une fonction "jeuxdessais()" qui crée des "jeux d'essais" de paramètres pour calculer plusieurs valeurs d'une expression, et obtenir d'un seul coup la liste des résultats.

Avec les fonctions python "map()" et lambda, on peut faire des choses étonnantes. Par exemple, on simule un emprunt de 10000 Euros à rembourser en 24 mois, et on cherche la mensualité obtenue avec un intérêt de 3%, 3.5%, 4%, 4.5%, 5%, 5.5%, 6%, 6.5%, 7%, 7.5%, soit 10 valeurs:

Création de la fonction lambda:

code:
sto("mens",lambda L: menscredit(L[0],L[1],L[2]))

Calcul des 10 mensualités pour les 10 intérêts testés, et ceci d'un seul coup (j'ai arrondi les résultats aux centimes):

code:
map(mens,jeuxdessais(10,[10000,3,24],[10000,7.5,24]))

===> résultat =[429.81, 432.03, 434.25, 436.48, 438.71, 440.96, 443.21, 445.46, 447.73, 450]

Avec la même fonction lambda, on peut calculer ce que donnerait pour un intérêt de 4% des mois de remboursement allant de 24 à 36 mois, soit 13 valeurs (j'ai arrondi les résultats aux centimes):

code:
map(mens,jeuxdessais(13,[10000,4,24],[10000,4,36]))

===> résultat =[434.25, 417.56, 402.16, 387.90, 374.66, 362.34, 350.83, 340.07, 329.98, 320.51, 311.59, 303.18, 295.24]

(Que les experts me pardonnent mon enthousiasme: je découvre Python avec beaucoup de plaisir...)

Amusez-vous bien!

Tyrtamos

 • Re: Info: une calculatrice graphique facilement extensible

Posté par tyrtamos le 05/02/2008 20:11
Bonjour,

Juste une petite info pour ceux qui sont intéressés: le dernier journal Linux+ DVD 2/2008 vient de paraître avec un article de 11 pages sur la calculatrice en question (appelée "Calculext" pour ses facilités d'extension par l'utilisateur).

A noter que depuis la rédaction de l'article, la version est passée à 1.30, et une version dérivée "en ligne" est utilisable avec un simple navigateur web:
http://calculext.jpvweb.com

Pour ceux qui auront le courage de se pencher sur mon code: n'hésitez pas à me faire des suggestions d'amélioration:
http://linux.jpvweb.com/mesrecetteslinux/calculatrice

Je dois dire que je me suis "cogné" à quelques mystères. Par exemple, le thread de calcul refusait de me rendre la main (=gel de l'écran) avant la fin du calcul avec factorielle 20000, mais y arrivait très bien avec factorielle 200000! Je suis resté plusieurs jours sur ce problème et je ne l'ai résolu qu'à moitié en bricolant l'algorithme de calcul et en ajoutant des temporisations, mais ce n'est pas très élégant. J'en ai déduit (je ne suis pas sûr d'avoir raison) que comme le thread ne rend la main qu'après 100 bytecodes, il pouvait ne pas rendre la main du tout avec des boucles très courtes ne comportant que très peu d'instructions (la boucle se trouvant entièrement à l'intérieur des 100 bytecodes). Mais si quelqu'un a une meilleure explication (et la solution qui va avec!)? Merci d'avance!

Tyrtamos

 • Re: Info: une calculatrice graphique facilement extensible

Posté par tyrtamos le 05/02/2008 20:12
Bonjour,

Juste une petite info pour ceux qui sont intéressés: le dernier journal Linux+ DVD 2/2008 vient de paraître avec un article de 11 pages sur la calculatrice en question (appelée "Calculext" pour ses facilités d'extension par l'utilisateur).

A noter que depuis la rédaction de l'article, la version est passée à 1.30, et une version dérivée "en ligne" est utilisable avec un simple navigateur web:
http://calculext.jpvweb.com

Pour ceux qui auront le courage de se pencher sur mon code: n'hésitez pas à me faire des suggestions d'amélioration:
http://linux.jpvweb.com/mesrecetteslinux/calculatrice

Je dois dire que je me suis "cogné" à quelques mystères. Par exemple, le thread de calcul refusait de me rendre la main (=gel de l'écran) avant la fin du calcul avec factorielle 20000, mais y arrivait très bien avec factorielle 200000! Je suis resté plusieurs jours sur ce problème et je ne l'ai résolu qu'à moitié en bricolant l'algorithme de calcul et en ajoutant des temporisations, mais ce n'est pas très élégant. J'en ai déduit (je ne suis pas sûr d'avoir raison) que comme le thread ne rend la main qu'après 100 bytecodes, il pouvait ne pas rendre la main du tout avec des boucles très courtes ne comportant que très peu d'instructions (la boucle se trouvant entièrement à l'intérieur des 100 bytecodes). Mais si quelqu'un a une meilleure explication (et la solution qui va avec!)? Merci d'avance!

Tyrtamos

 • Re: Info: une calculatrice graphique facilement extensible

Posté par ychaouche le 19/02/2008 10:55
Salut,

J'ai été très déçu par la librairie standard de python quand j'ai voulu faire une calculatrice qui me calcule les heures que je passe sur une tâche donnée.

Par exemple, quelque chose qui me calculerait (18:30 - 14:00) + (13:00 - 9:30).

Le module datetime sait additionner les heures mais ne sait pas les soustraire !! Quelqu'un a-t-il pu faire une soustraction de date sans trop se compliquer la vie ? (sans tout convertir en minutes puis faire le calcule soit même puis reconvertir en heures:minutes).

wink Re: Info: une calculatrice graphique facilement extensible

Posté par glickind le 19/02/2008 15:20
(18:30 - 14:00) + (13:00 - 9:30)
utiliser timedelta pour des soustractions et avoir le résultat en secondes :
code:
>>> from datetime import datetime,timedelta
>>> t=timedelta(hours=18,minutes=30) - timedelta(hours=14) + timedelta(hours=13) - timedelta(hours=9,minutes=30)
>>> t
datetime.timedelta(0, 28800)

saisir une date quelconque pour convertir en Heures:Minutes
code:
>>> d=datetime(2008, 2, 19)  + t
>>> d.strftime("%H:%M")
'08:00'

 • Re: Info: une calculatrice graphique facilement extensible

Posté par glickind le 19/02/2008 17:21
attention pense à afficher le nombre de jours si nécessaire
code:
>>> from datetime import datetime,timedelta
>>> t=timedelta(hours=20)+timedelta(hours=6,minutes=30,seconds=40)
>>> d=datetime(2008, 2, 19) + t
>>> print ( str(t.days) + " jour(s) " if t.days else "" ) + d.strftime("%H:%M:%S")
1 jour(s) 02:30:40

>>> t=timedelta(hours=20) - timedelta(hours=6,minutes=30,seconds=40)
>>> d=datetime(2008, 2, 19) + t
>>> print ( str(t.days) + " jour(s) " if t.days else "" ) + d.strftime("%H:%M:%S")
13:29:20

 • Re: Info: une calculatrice graphique facilement extensible

Posté par ychaouche le 22/02/2008 15:47
Merci glickind, je n'avais pas pensé à utiliser timedelta de cette manière là ! effectivement ta solution parait bonne.

Je trouve quand même bizarre que ceci marche :
code:
d1 = datetime(y,m,d,h1,m1)
d2 = datetime(y,m,d,h2,m2)
somme = d1 + d2
return str(somme)

mais pas ceci :
code:
d1 = datetime(y,m,d,h1,m1)
d2 = datetime(y,m,d,h2,m2)
delta = d2 - d1
return str(delta)