- Probleme d'affichage d'une fonction sur la fenêtre tkinter
- Fonction si et - Guide
- Problème affichage fenêtre windows 10 - Guide
- Fenêtre hors écran windows 11 - Guide
- Affichage double ecran - Guide
- Fenêtre - Guide
4 réponses
30 déc. 2022 à 15:35
En fin de compte, on aurait ça:
# -*- coding: utf-8 -*- from tkinter import * def monnaie_rendue(argent): liste_monnaies = [500, 200, 100, 50, 20, 10, 5, 2, 1] liste_monnaies_vide = [] dico_monnaies_occurrence = {} while argent > 0: for monnaie_a_rendre in liste_monnaies: if monnaie_a_rendre <= argent: argent -= monnaie_a_rendre liste_monnaies_vide.append(monnaie_a_rendre) break if(liste_monnaies_vide != []): for monnaies_a_rendre_occurrence in liste_monnaies_vide: dico_monnaies_occurrence[monnaies_a_rendre_occurrence] = liste_monnaies_vide.count(monnaies_a_rendre_occurrence) return(dico_monnaies_occurrence) def onReturn(evt): dr.delete(1.0, END) row = 0.0 somme = my_entry.get() if(somme == ''): dr.insert(row,'Entrer une somme') else: dico_monnaie = monnaie_rendue(int(somme)) if(dico_monnaie == {}): dr.insert(row,'Pas de monnaie') else: for dico_occurrence in dico_monnaie: dr.insert(row, (f'Il faut rendre {dico_monnaie[dico_occurrence]} billets de {dico_occurrence}\n')) row+=5.0 WIDTH, HEIGHT = 400, 150 main_win = Tk() main_win.title('Monnaie à rendre') main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+300+100') l1 =Label(main_win, text = 'Entrer une somme') l1.place(x=10,y=10) my_entry = Entry(main_win) my_entry.place(x=130,y=10) my_entry.bind("<Return>", onReturn) my_entry.focus() dr = Text(main_win, width = 40, height = 5) dr.place(x=10, y=50) main_win.mainloop()
Modifié le 28 déc. 2022 à 12:30
Bonjour,
au lieu de print, il faut utiliser
my_label['text'] = mon_message
par contre, si tu as plusieurs messages à afficher, utilise plutot le widget Text
on y verrait plus clair si tu affichais ton code avec les balises de code
mode d'emploi:
https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code
Visuellement, ça doit ressembler à ce que tu vois dans mon exemple ci-dessus
Pour plus de clarté, il faut aussi écrire dans cet ordre:
les imports
les fonctions
le programme principal (création fenêtre et widgets)
28 déc. 2022 à 14:15
par contre, tu n'as pas suivi mon conseil pour l'affichage du code
essaie ça pour voir:
# -*- coding: utf-8 -*- from tkinter import * def onReturn(evt): my_label['text'] = my_entry.get() WIDTH, HEIGHT = 600, 400 main_win = Tk() main_win.title('Test') main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+300+100') my_label=Label(main_win) my_label.pack() my_entry = Entry(main_win) my_entry.pack() my_entry.bind("<Return>", onReturn) my_entry.focus() main_win.mainloop()
Modifié le 28 déc. 2022 à 16:14
j'ajoute que ceci ne donne rien:
monnaie_rendu(int(un_entry.get()))
puisque ta fonction monnaie_rendu() ne retourne pas de valeur
il faudrait retourner la monnaie à rendre, et dans un Text, pas dans un label car il y a plusieurs lignes
ca donnerait:
# -*- coding: utf-8 -*- from tkinter import * def monnaie_rendue(argent=1): """ Calcul et renvoie la monnaie à rendre en fonction de la valeur placée en argument. On utilise deux listes, l'une contenant les monnaies que l'on puisse rendre (liste_monnaies) et l'autre au départ vide à laquelle on ajoutera au fur et à mesure les monnaies a rendre (liste_monnaies_vide). De plus, on se sert d'un dictionnaire dans un premier temps vide auquel on ajoutera en clé l'une des monnaies à rendre et en valeur son occurrence (dico_monnaies_occurrence). Premièrement, si la valeur placée en argument est 0 on ne rentrera pas dans la boucle et un message sera affiché. Pour effectuer le calcul on parcourt liste_monnaies et on observe si la valeur sélectionnée est inférieure ou égale à la valeur de l'argument, si c'est le cas on soustrait la valeur sélectionnée à la valeur de l'argument et on ajoute la valeur sélectionée à liste_monnaies_vide. Si ce n'est pas le cas on continue de parcourir liste_monnaies jusqu'à trouver une valeur inférieure ou égale à celle de l'argument. La boucle s'arrête lorsque la valeur de l'argument est égale à zéro. Pour renvoyer les monnaies à rendre, on parcourt liste_monnaies_vide et on attribue à chaque clé de dico_monnaies_occurrence l'une des monnaies à rendre avec pour valeur son occurrence. Pour finir on parcours dico_monnaies_occurrence et on affiche pour chacune de ses clés sa valeur. Entrée : une valeur placée en argument dont on veut connaitre la monnaie à rendre Sortie : la monnaie à rendre """ liste_monnaies = [500, 200, 100, 50, 20, 10, 5, 2, 1] liste_monnaies_vide = [] dico_monnaies_occurrence = {} if argent == 0: print("Il n'y a pas de monnaie à rendre") while argent > 0: for monnaie_a_rendre in liste_monnaies: if monnaie_a_rendre <= argent: argent -= monnaie_a_rendre liste_monnaies_vide.append(monnaie_a_rendre) break for monnaies_a_rendre_occurrence in liste_monnaies_vide: dico_monnaies_occurrence[monnaies_a_rendre_occurrence] = liste_monnaies_vide.count(monnaies_a_rendre_occurrence) return(dico_monnaies_occurrence) def onReturn(evt): dico_monnaie = monnaie_rendue(int(my_entry.get())) dr.delete(1.0, END) row = 0.0 for dico_occurrence in dico_monnaie: dr.insert(row, (f'Il faut rendre {dico_monnaie[dico_occurrence]} billets de {dico_occurrence}\n')) row+=5.0 WIDTH, HEIGHT = 600, 400 main_win = Tk() main_win.title('Test') main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+300+100') dr = Text(main_win, width = 40, height = 5) dr.pack() my_entry = Entry(main_win) my_entry.pack() my_entry.bind("<Return>", onReturn) my_entry.focus() main_win.mainloop()
28 déc. 2022 à 18:00
Merci infiniment, ca m'aide grandement.
Vraiment merci beaucoup !
Modifié le 29 déc. 2022 à 11:19
Bonjour,
En ce qui concerne ta fonction monnaie_rendue(), il faut qu'elle reste une "boite noire":
on y entre une somme elle retourne la monnaie .. ou pas
L'affichage du résultat (monnaie ou pas) doit être à l'extérieur, moi, je ferais ça:
def monnaie_rendue(argent): liste_monnaies = [500, 200, 100, 50, 20, 10, 5, 2, 1] liste_monnaies_vide = [] dico_monnaies_occurrence = {} while argent > 0: for monnaie_a_rendre in liste_monnaies: if monnaie_a_rendre <= argent: argent -= monnaie_a_rendre liste_monnaies_vide.append(monnaie_a_rendre) break if(liste_monnaies_vide != []): for monnaies_a_rendre_occurrence in liste_monnaies_vide: dico_monnaies_occurrence[monnaies_a_rendre_occurrence] = liste_monnaies_vide.count(monnaies_a_rendre_occurrence) return(dico_monnaies_occurrence)
Et dans onReturn tu testes si dico_monnaie est égal à {} ou pas et tu affiche dans le widget Text le
message "pas de monnaie à rendre" sinon, tu affiche la monnaie comme on le fait déjà
Dans onReturn, n'oublie pas non plus de tester si my_entry.get() est vide avant de l'envoyer dans monnaie_rendue
30 déc. 2022 à 22:34
Merci beaucoup encore une fois !