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

Résolu/Fermé
marclcf - Modifié le 10 mai 2022 à 15:25
 marclcf - 14 mai 2022 à 11:02
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 33299 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 octobre 2024 7 791
10 mai 2022 à 15:56
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 23236 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 octobre 2024 Ambassadeur 1 539
10 mai 2022 à 09:54
bonjour,
command= lambda ij= str(i) + str(j) : func(ij)
1
yg_be Messages postés 23236 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 octobre 2024 1 539
10 mai 2022 à 09:59
ou bien, plus propre:
command= lambda x,y = i,j : func(x,y) 
1
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