Définition d'une fonction dépendante d'un indice

Résolu
marclcf -  
 marclcf -
Bonsoir à tous,

J'ai un projet python dans lequel j'utilise le module
tkinter
afin de créer une interface graphique qui propose une grille 4x5 de boutons.

J'ai un problème au moment de donner le paramètre
command
de l'objet
Button
car j'aimerais que la fonction appelée dépende du bouton sur lequel on clique.

Une solution pourrait consister à définir à la main 20 fonctions par exemple nommées
func00
,
func01
, etc. mais je trouve cela laborieux pour rien.

Pour le moment, je me sers de la ligne suivante pour ajouter à ma fenêtre mes 20 boutons :
M_cases = [
    [
        tk.Button(
            window,
            background='brown',
            command=eval("func"+str(ij)),
            height='6',
            width='16'
        )
        for j in range(5)
    ]
    for i in range(4)
]


Je suis preneur pour toute sorte de solution car je ne trouve rien fonctionne depuis un moment.

Merci :-)
Marc
A voir également:

3 réponses

mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 
Bonjour,

Une manière de faire consiste à passer par un foncteur :

import tkinter as tk

m = 4
n = 5

class Fonctor:
    def __init__(self, i, j):
        print(f"{i},{j}")
        self.i = i
        self.j = j
    def __call__(self):
        print(f"Clic sur le Bouton ({self.i}, {self.j})")

root = tk.Tk()
buttons = [
    [   
        tk.Button(
            text=f"Bouton ({i}, {j})",
            command=Fonctor(i, j)
        )
        for j in range(n)
    ]
    for i in range(m)
]

for i in range(m):
    for j in range(n):
        buttons[i][j].pack()

root.mainloop()


Bonne chance
2
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
command= lambda ij= str(i) + str(j) : func(ij)
1
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
ou bien, plus propre:
command= lambda x,y = i,j : func(x,y) 
1
marclcf
 
Merci pour vos réponses ! Je pars essayer celle de mamiemando. J'avais en effet entendu parler de __call__ pour une classe mais je n'avais pas pensé à l'utiliser ici... Merci encore à vous deux (:
0