Bonsoir,
J'avais déjà demandé l'autorisation de poser des questions sur Python, celle-ci m'avait été accordée mais dans le bar uniquement (ce qui est bien normal). Je me permets donc de revenir vers vous :
Après avoir étudié les bases de PYTHON 3 (avant de m'attaquer à microPython) j'essaye de créer une application qui regroupe l'utilisation des classes et d'une interface graphique. J'ai choisi celle fournie avec Python, c'est à dire Tkinter.
Mon problème est le suivant :
-
Lorsque je créé à l'intérieur d'une classe un groupe de label (81) et que je les affiche avec des boucles imbriquées en utilisant la méthode
grid, je souhaite récupérer la position dans la "grid" (row + column) avec un clic de souris sur le widget (ici Label) ; -
J'essaye d'utiliser la méthode
widget.grid_info()qui fonctionne pour un label unique que j'ai ajouté (label2) mais qui ne fonctionne pas avec le groupe des 81 "label". Le problème vient très certainement du fait que les 81 "label" ne sont pas précisément identifiés.
Ma question est donc : est-il possible de procéder ainsi pour un groupe de widgets de même nom ?
Sinon j'essayerai d'aborder mon problème différemment ![]()
Voici le code :
import tkinter as tk
from tkinter import messagebox
class forum(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.grille = self.creation_grille()
self.creer_widgets()
def creation_grille(self):
grille = [[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."]]
return grille
def creer_widgets(self):
# Création de 81 labels avec des boucles imbriquées
for row in range(9):
for col in range(9):
self.label = tk.Label(self,text=self.grille[row][col], width=7, bg = "yellow", highlightthickness=1, highlightbackground='#000000',font=("arial", 24), fg = 'blue')
pad_y = (0, 0)
pad_x = (0, 0)
if (row+1) % 3 == 0 and (row+1) < 9: # skip for last row
pad_y = (0, 10)
if (col+1) % 3 == 0 and (col+1) < 9: # skip for last column
pad_x = (0, 10)
self.label.grid(row=row, column=col, ipadx=5, ipady=5, padx=pad_x, pady=pad_y)
self.label.bind("<Button-1>",self.mouse)
#création d'un label unique
self.label2 = tk.Label(self,text="LABEL ", font=("arial", 24), highlightthickness=1, highlightbackground='#000000')
self.label2.grid(row=10, column=1, ipadx=5, ipady=5, padx=0, pady=10)
self.label2.bind("<Button-1>",self.mouse2)
def mouse(self,event):
grid_info = self.label.grid_info()
messagebox.showinfo("info",str(grid_info["row"]) + " " + str(grid_info["column"]))
def mouse2(self,event):
grid_info = self.label2.grid_info()
messagebox.showinfo("info",str(grid_info["row"]) + " " + str(grid_info["column"]))
app = forum()
app.title("forum arduino philippe86220")
app.mainloop()# Boucle d'attente des événements
Visuellement ça donne ceci :
et ça ne fonctionne que pour le dernier label en bas à gauche.
Merci par avance.
PS : MAC OS 10.15.7 Catalina
Python 3.11.4
tkinter 8.6
