Tak to mogłoby mniej więcej wyglądać:
import tkinter as tk
from functools import partial
class Okienko:
def __init__(self):
self.win = tk.Tk()
self.win.title('Kolko i krzyzyk')
self.win.geometry('300x400')
interakcja0 = tk.Button(self.win, text='O', font=('Courier', 25, 'bold'), background='blue')
interakcja0.bind('<Button-1>', partial(self.buttonListener, "interakcja0")) # sposob z partial()+bind
interakcja0.grid(column=1, row=2)
interakcja = tk.Button(self.win, text='O', font=('Courier', 25, 'bold'), background='blue',
command = partial(self.buttonCommand, "interakcja")) # partial() + command
interakcja.grid(column=2, row=2)
interakcja2 = tk.Button(self.win, text='O', font=('Courier', 25, 'bold'), background='blue')
interakcja2.bind('<Button-1>', lambda event, msg="interakcja2": self.buttonListener(msg, event)) # z lambda
interakcja2.grid(column=3, row=2)
# cut cut cut
def mainloop(self):
self.win.mainloop()
def buttonCommand(self, msg):
print(f'ButtonCommand: msg={msg}')
def buttonListener(self, message, event):
print(f'buttonlistener: event={event}, msg={message}')
okno = Okienko()
okno.mainloop()
- Nie importuj wszystkiego z tkinter bo tam pełno jednoznakowych stałych
- Klasa Okienko w konstruktorze powinna zainicjować tkinter i zbudować wszystkie widgety
- Button ma parametr "command" do którego można przypisać callback ale "bind" też wystarczy.
- callbacki wrapujemy poprzez partial() albo z lambdą, wtedy można przekazać ekstra parametr informujący jaki przycisk go wywołał