Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   How to change colors of multiple widgets after hovering in Tkinter (http://www.velocityreviews.com/forums/t956398-how-to-change-colors-of-multiple-widgets-after-hovering-in-tkinter.html)

mountdoom12@gmail.com 01-10-2013 06:32 PM

How to change colors of multiple widgets after hovering in Tkinter
 
Hello,

Im 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

Peter Otten 01-10-2013 07:13 PM

Re: How to change colors of multiple widgets after hovering in Tkinter
 
mountdoom12@gmail.com wrote:

> 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()




Rick Johnson 01-11-2013 05:43 AM

Re: How to change colors of multiple widgets after hovering in Tkinter
 
On Thursday, January 10, 2013 1:13:38 PM UTC-6, Peter Otten wrote:
> mountdoom wrote:
> > Im trying to make a script, which will change the background and
> > foreground color of widgets after hovering.


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).

Rick Johnson 01-11-2013 05:43 AM

Re: How to change colors of multiple widgets after hovering in Tkinter
 
On Thursday, January 10, 2013 1:13:38 PM UTC-6, Peter Otten wrote:
> mountdoom wrote:
> > Im trying to make a script, which will change the background and
> > foreground color of widgets after hovering.


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).


All times are GMT. The time now is 05:21 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.