#python Création de n variables dans une boucle?

Résolu/Fermé
Zazou1er - Modifié le 14 oct. 2017 à 02:26
 Zazou1er - 14 oct. 2017 à 15:48
Bonjour,

J'ai récemment rencontré un problème dans mon code et c'est après moult recherches que je m'adresse ici. Voilà j'aimerai faire en sorte de créer n variables pouvant chacune afficher un bouton qui commanderait la lecture d'un fichier différent pour chaque variable.
J'ai cru comprendre qu'il fallait se servir de dictionnaires ou bien de listes mais après de nombreux essais et peu d'explications trouvée (ou alors pas de mon niveau) je me retrouve toujours au même point. Qu'elle que soit ma méthode je me retrouve avec un code qui joue toujours la même piste audio quel que soit le bouton (j'ai nommé mes fichiers audio Rec1, Rec2...etc).

J'espère que vous pourrez m'aider.

Mon code:


import tkinter
import pygame

root=tkinter.Tk()
pygame.mixer.init()

path = r'C:\Users\sasuk\Desktop\Python\Audio'

def sound(x):
    pygame.mixer.music.load(path + '\Rec' + x + '.wav')
    pygame.mixer.music.play()


dic = {}
i = 1

while i < 10:
    key = 'Son' + str(i)
    value = str(i)
    dic[key] = tkinter.Button(root, command = lambda: sound(value))
    dic[key].pack()
    i += 1
print(dic)

root.mainloop()


Message édité par la modération
Merci d'utiliser la coloration syntaxique lorsque du code source est
présent dans votre message afin de rendre celui-ci plus lisible.
Plus d'informations sur cet article : Utilisation des balises <code></code>

1 réponse

La solution à ton problème est qu'il faut passer le paramètre en argument du lambda en le définissant.

Pour illustrer, voici ce que tu obtiens en n'itialisant pas l'argument :

>>> d = dict()
>>> for i in range(10):
... d[i] = lambda : i
...
>>> d[5]()
9


Pour parer cela, il suffit donc de définir la variable en argument de lambda.

>>> d = dict()
>>> for i in range(10):
... d[i] = lambda i=i : i
...
>>> d[5]()
5


Le i=i est évidement arbitraire, tu peux utiliser ce que tu veux comme nom de variable, toto=i, toto sera alors à mettre dans ta fonction située dans la fonction anonyme.

Je te laisse adapter à ton code.
1
Merci beaucoup!
0