# calculette 2 termes # prend en compte des clicks sur boutons # permet une lecture clavier from Tkinter import * # Les chaines constantes possibles pour la variable operateur STR_ADD = ' + ' STR_SOUSTR = ' - ' STR_MUL = ' * ' STR_DIV = ' / ' #variables globales nb1 = '' #une chaine vide au depart, un nombre ensuite nb2 = '' #une chaine vide au depart, un nombre ensuite operateur = '' #une chaine vide au depart, une chaine operateur ensuite egal = '' #une chaine vide au depart, ' = ' ensuite result = '' #une chaine vide au depart, un nombre ensuite calcul = '' #sera utilisee comme StringVar() comme variabletext d'un label #les fonctions def click(chiffre): #lorsqu'on click sur un chiffre global nb1, nb2, result if egal == '': #le calcul n'est pas fini if operateur == '': #l'operateur n'est pas introduit if nb1 == '': nb1 = 0 nb1 = 10*nb1 + chiffre calcul.set(str(nb1)) else: if nb2 == '': nb2 = 0 nb2 = 10*nb2 + chiffre calcul.set(str(nb1) + operateur + str(nb2)) def click_operateur(str_operateur): #lorsqu'on click sur un operateur global operateur if egal == '': #le calcul n'est pas fini if operateur == '' and nb1 != '': #l'operateur n'est pas introduit et nb1 existe operateur = str_operateur calcul.set(str(nb1) + operateur) def click_egal(): #lorsqu'on click sur egal global result, egal if nb2 != '': egal = ' = ' if operateur == STR_ADD: result = nb1 + nb2 elif operateur == STR_SOUSTR: result = nb1 - nb2 elif operateur == STR_MUL: result = nb1 * nb2 elif operateur == STR_DIV: result = nb1*1.0 / nb2 calcul.set(str(nb1) + operateur + str(nb2) + egal + str(result)) def click_cancel(): #lorsqu'on click sur cancel global nb1, nb2, operateur, egal, result nb1 = '' nb2 = '' operateur = '' egal = '' result = '' calcul.set('') #la routine qui prend en charge l'enfoncement d'une touche def gestion_touche_enfoncee(touche): print "repr(touche.char) : ", repr(touche.char), "touche.char : ", touche.char touche_str = touche.char if touche_str in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']: click(int(touche_str)) elif touche_str == '+': click_operateur(STR_ADD) elif touche_str == '-': click_operateur(STR_SOUSTR) elif touche_str == '*': click_operateur(STR_MUL) elif touche_str == '/': click_operateur(STR_DIV) elif touche_str == ' ' or touche_str == '\r': click_egal() elif touche_str == '\x7f': click_cancel() #creation de la fenetre my_frame = Tk() my_frame.title("calculette 2 termes") my_frame.minsize(200, 200) #ecoute d'un enfoncement clavier my_frame.bind("", gestion_touche_enfoncee) #la 1ere ligne contient un label dont le texte est associe a la variable 'calcul' calcul = StringVar() Label(textvariable = calcul, height = 2).grid(row=0, column=0, columnspan=4, sticky=W) calcul.set('') #la 2eme ligne Button(text = "7", width = 3, command = lambda:click(7)).grid(row=1, column=0) Button(text = "8", width = 3, command = lambda:click(8)).grid(row=1, column=1) Button(text = "9", width = 3, command = lambda:click(9)).grid(row=1, column=2) Button(text = STR_DIV, width = 3, command = lambda:click_operateur(STR_DIV)).grid(row=1, column=3) #la 3eme ligne Button(text = "4", width = 3, command = lambda:click(4)).grid(row=2, column=0) Button(text = "5", width = 3, command = lambda:click(5)).grid(row=2, column=1) Button(text = "6", width = 3, command = lambda:click(6)).grid(row=2, column=2) Button(text = STR_MUL, width = 3, command = lambda:click_operateur(STR_MUL)).grid(row=2, column=3) #la 4eme ligne Button(text = "1", width = 3, command = lambda:click(1)).grid(row=3, column=0) Button(text = "2", width = 3, command = lambda:click(2)).grid(row=3, column=1) Button(text = "3", width = 3, command = lambda:click(3)).grid(row=3, column=2) Button(text = STR_SOUSTR, width = 3, command = lambda:click_operateur(STR_SOUSTR)).grid(row=3, column=3) #la derniere ligne Button(text = "0", width = 3, command = lambda:click(0)).grid(row=4, column=0) Button(text = "c", width = 3, command = click_cancel).grid(row=4, column=2) Button(text = STR_ADD, width = 3, command = lambda:click_operateur(STR_ADD)).grid(row=4, column=3) Button(text = " = ", width = 20, command = click_egal).grid(row=5, column=0, columnspan=4) #la phase d'attente d'un evenement my_frame.mainloop()