Appunti di Programmazione

Creative Commons License

Tkinter 3 - Unica funzione per eventi di due Button

Scrivendo un piccolo programma in Python 3 e Tkinter, mi sono imbattuto nel seguente problema:
dovevo collegare l'evento click di diversi Button ad un'unica funzione, in modo che premendone uno la funzione stessa fosse in grado di determinare quale Button avesse sollevato l'evento e cambiasse il testo sul pulsante utilizzato.

Detto in altri termini:
premendo su Pulsante_1 il testo deve essere modificato da "Pulsante 1" a "Altro Nome 1".
premendo su Pulsante_2 il testo deve essere modificato da "Pulsante 2" a "Altro Nome 2"
...

Facendo qualche esperimento e diverse ricerche nella rete, sono riuscito a capire che attraverso -evento.widget- si ottiene il nome del widget che ha reagito al click del mouse. Premendo Pulsante_1 si ottiene .!button, premendo Pulsante_2 si ottiene .!button2, e così via... Sapendo questo ho scritto il codice seguente che mi risolve il problema.

NOTA - il numero dei button (.!button, .!button2, .!button3, .!button4 ...) dipende dall'ordine con cui sono stati istanziati, non dal nome che è stato assegnato loro.

import tkinter as tk
from tkinter import *

class MiaClass:
    def __init__(self, master):
        
        self.pulsante_1=tk.Button(master, text="Pulsante 1")
        self.pulsante_1.bind("<Button-1>", self.cambia_testo)
        self.pulsante_1.pack()

        self.pulsante_2=tk.Button(master, text="Pulsante 2")
        self.pulsante_2.bind("<Button-1>", self.cambia_testo)
        self.pulsante_2.pack()
        
    def cambia_testo(self, evento):
        testo=str(evento.widget)
        
        if testo.endswith("button"):
            self.pulsante_1.configure(text="Atro nome 1")
        if testo.endswith("button2"):
            self.pulsante_2.configure(text="Atro nome 2")

finestra=Tk()
miaClass=MiaClass(finestra)
    
finestra.mainloop()