Probleme d'affichage d'une fonction sur la fenêtre tkinter
arthur -
Bonjour,
j'aimerai pouvoir afficher le resultat de ma fonction sur tkinter en utilisant un label mais je n'y arrive pas. L'utilisateur sasi une valeur, la focntion s'execute mais le resultat ne s'affiche que dans la console et je souhaiterai l'afficher sur ma fenêtre tkinter. Merci d'avance
Windows / Chro
def monnaie_rendu(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)
for dico_occurrence in dico_monnaies_occurrence:
print(f'Il faut rendre {dico_monnaies_occurrence[dico_occurrence]} billets de {dico_occurrence}')
monnaie_rendu(8540)
# tkinter
from tkinter import *
# personnaliser la fenêtre
window = Tk()
window.title("monnaie_rendu")
window.geometry("1920x1080")
window.minsize(480, 360)
window.iconbitmap("Harry_icon_projet.ico")
window.config(background="#FF0000")
# mettre un champ
un_entry = Entry(window, font=("Century Gothic", 40), width=14, bd=0)
un_entry.pack()
# definir la fonction onReturn
def onReturn(event):
print("pressed")
value=monnaie_rendu(int(un_entry.get()))
mylabel=Label(window,textvariable=value)
mylabel.pack()
#bind le champ
un_entry.bind("<Return>", onReturn)
# afficher la fenêtre
window.mainloop()
me 108.0.0.0
- 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
- Windows 11 affichage classique - Guide
4 réponses
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()
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)
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()
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()
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
Merci beaucoup encore une fois !