How to change colors of multiple widgets after hovering in Tkinter

M

mountdoom12

Hello,

I´m trying to make a script, which will change the background and foreground color of widgets after hovering.

-------------------------
from Tkinter import *

root=Tk()

Hover1=Button(root,text="Red color", bg="white")
Hover1.pack()

Hover2=Button(root,text="Yellow color", bg="white")
Hover2.pack()

Hover1.bind("<Enter>",Hover1.configure(bg="red"))
Hover1.bind("<Leave>",Hover1.configure(bg="white"))

Hover2.bind("<Enter>",Hover2.configure(bg="yellow"))
Hover2.bind("<Leave>",Hover2.configure(bg="white"))

root.mainloop()
-------------------------

but when I hover on any button, nothing happens, they stay white. I know I could use a function, but there would be two functions for every widget (1 for , 1 for ). I'd like to create a single function, which will recolor that widget I hover on and explain why this script is not doing what I want itto do.

I hope I described my problem well. Thanks for every answer.

PS: I would like to avoid classes.

mountDoom
 
P

Peter Otten

I´m trying to make a script, which will change the background and
foreground color of widgets after hovering.
but when I hover on any button, nothing happens, they stay white. I know I
could use a function, but there would be two functions for every widget (1
for , 1 for ). I'd like to create a single function, which will recolor
that widget I hover on and explain why this script is not doing what I
want it to do.

I hope I described my problem well.

You did.
from Tkinter import *

root=Tk()

Hover1=Button(root,text="Red color", bg="white")
Hover1.pack()

Hover2=Button(root,text="Yellow color", bg="white")
Hover2.pack()

Hover1.bind("<Enter>",Hover1.configure(bg="red"))

This calls Hover1.configure(bg="red") once and binds the result of that
method call (which is None) to the event. So the above line is equivalent to

Hover1.configure(bg="red")
Hover1.bind("<Enter>", None)

You say you don't want to write a function, but that is really the correct
aproach. Fortunately there is a way to create such a function on the fly:

def f(event):
Hover1.configure(bg="red")

can be written as

f = lambda event: Hover1.configure(bg="red")

With that your code becomes

Hover1.bind("<Enter>", lambda event: Hover1.configure(bg="red"))
Hover1.bind("<Leave>", lambda event: Hover1.configure(bg="white"))

and so on. In this specific case this doesn't have the desired effect
because when the mouse enters a Button widget its background color changes
to 'activebackground'. So you don't really need to bind the enter/leave
events. Specify an activebackground instead when you create the buttons. For
example:

Hover1 = Button(root, text="Red color", bg="white", activebackground="red")
Hover1.pack()
 
R

Rick Johnson

Peter's advice is spot on except you may want ALL widgets to change colors on <ENTER> and <LEAVE> events. If you want all widgets use the "w.bind_all"method instead of "w.bind". Also check out the "w.bind_class" method to confine bindings to one particular class of widget (like a Tkinter.Button).
 
R

Rick Johnson

Peter's advice is spot on except you may want ALL widgets to change colors on <ENTER> and <LEAVE> events. If you want all widgets use the "w.bind_all"method instead of "w.bind". Also check out the "w.bind_class" method to confine bindings to one particular class of widget (like a Tkinter.Button).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top