TKINTER : Argument d'une fonction qui ne change pas...

Résolu/Fermé
Aidez_moi - 10 déc. 2022 à 19:11
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 11 déc. 2022 à 14:23

Bonjour,

Je suis novice et je fais face à un petit problème sur Tkinter.

Je cherche à créer des boutons dans un programme, cependant le nombre de boutons peut varier et l'argument de la fonction auquel il renvoie aussi.

Le problème c'est que quand j'appuie sur chacun des boutons, cela me renvoie toujours "9" dans la console. Ce que je cherche est que quand j'appuie sur le bouton1, cela me retourne "1", pour le bouton2, "2", pour le bouton3, ect...

from tkinter import *

def afficher(i):
    print(i)

fen = Tk()
fen.geometry("500x500")

for i in range(10):
    globals()["but_%s" % i] = Button(fen, text=str(i), command=lambda:afficher(i))
    globals()["but_%s" % i].pack()


fen.mainloop()

Merci
Windows / Chrome 108.0.0.0

3 réponses

Bonsoir, problème classique, la valeur de i change dans ta boucle, comme sa référence est passée à tes multiples fonctions anonymes, alors normal que tes fonctions retournent la valeur finale de i.

Pour pallier cela, il faut garder la valeur de i dans une variable locale à la fonction.

... command=lambda value=i: afficher(value) ...

On aurait pu la nommer également i

Bonne continuation.

1
Thankyoutiroutoutou
10 déc. 2022 à 22:45

Problème résolu ! Merci !

Bonne continuation à vous aussi.

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
11 déc. 2022 à 14:23

Bonjour,

pourquoi ces noms de boutons avec globals()

ça marche bien sans ça:

from tkinter import *

def display(n):
	print(n)

WIDTH, HEIGHT = 600, 600

main_win = Tk()
main_win.title('test')
main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+500+100')

for k in range(5):
	b = Button(main_win, text=str(k), command=lambda n=k : display(n))
	b.pack()

main_win.mainloop()
0