Probleme d'affichage d'une fonction sur la fenêtre tkinter

Fermé
arthurlfbv - 28 déc. 2022 à 11:49
 arthur - 30 déc. 2022 à 22:34

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

A voir également:

4 réponses

Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
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()
1

Merci beaucoup encore une fois !

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
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)

0
def onReturn(event):
    print("pressed")
    monnaie_rendu(int(un_entry.get()))
    my_label=Label(window)
    my_label['text'] = monnaie_rendu(int(un_entry.get()))
    my_label.pack()

J'ai essayer ca, le résultat s'affiche dans la console mais sur ma fenêtre tkinter le label crée est vide

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
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()
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
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()
0
arthur > Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024
28 déc. 2022 à 18:00

Merci infiniment, ca m'aide grandement. 

Vraiment merci beaucoup !

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
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

0