Why my Tkinter bind buttons work incorrectly? When I go on the start button with the mouse, about button will change! show image
This is my code:
import tkinter as tk
class Panel(tk.Tk):
def __init__(self):
super().__init__()
# window config
self.title('test')
self.geometry('300x300')
self.configure(bg='#2b2e37')
def btns(self, x, y, text, bg, fg):
def on_enter(ctx):
self.btn['background'] = fg
self.btn['foreground'] = bg
def on_leave(ctx):
self.btn['background'] = bg
self.btn['foreground'] = fg
self.btn = tk.Button(self, text=text, bg=bg, fg=fg, activebackground=fg, activeforeground=bg, border=0, width=42, height=2)
self.btn.bind('<Enter>', on_enter)
self.btn.bind('<Leave>', on_leave)
self.btn.place(x=x, y=y)
if __name__ == '__main__':
window = Panel()
window.btns(0, 190, 'S T A R T', '#2b2e37', '#56fc03')
window.btns(0, 230, 'A B O U T', '#2b2e37', '#f5ec42')
window.mainloop()
I think it's for my oop code, I wrote this simply and worked correctly. Sorry for my bad English
CodePudding user response:
I fixed my code by writing separately for each button.
New code:
def btns(self):
def on_enter1(ctx):
self.btn1['background'] = '#56fc03'
self.btn1['foreground'] = '#2b2e37'
def on_leave1(ctx):
self.btn1['background'] = '#2b2e37'
self.btn1['foreground'] = '#56fc03'
def on_enter2(ctx):
self.btn2['background'] = '#f5ec42'
self.btn2['foreground'] = '#2b2e37'
def on_leave2(ctx):
self.btn2['background'] = '#2b2e37'
self.btn2['foreground'] = '#f5ec42'
self.btn1 = tk.Button(self, text='S T A R T', bg='#2b2e37', fg='#56fc03', activebackground='#56fc03', activeforeground='#2b2e37', border=0, width=42, height=2)
self.btn2 = tk.Button(self, text='A B O U T', bg='#2b2e37', fg='#f5ec42', activebackground='#f5ec42', activeforeground='#2b2e37', border=0, width=42, height=2)
self.btn1.bind('<Enter>', on_enter1)
self.btn1.bind('<Leave>', on_leave1)
self.btn2.bind('<Enter>', on_enter2)
self.btn2.bind('<Leave>', on_leave2)
self.btn1.place(x=0, y=190)
self.btn2.place(x=0, y=230)
if __name__ == '__main__':
window = Panel()
window.label()
window.btns()
window.mainloop()
CodePudding user response:
The button on which the event occurs is passed to the event handlers in the ctx
parameter in the widget
attribute, so you can use that instead of self.btn
:
def btns(self, x, y, text, bg, fg):
def on_enter(ctx):
ctx.widget['background'] = fg
ctx.widget['foreground'] = bg
def on_leave(ctx):
ctx.widget['background'] = bg
ctx.widget['foreground'] = fg
The problem with using self.btn
in place of ctx.widget
in these event handlers is that the second time you call btns
, self.btn
is replaced with the second button, so the event handlers you added to the first button end up making changes to the second button.