Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > How to change colors of multiple widgets after hovering in Tkinter

Reply
Thread Tools

How to change colors of multiple widgets after hovering in Tkinter

 
 
mountdoom12@gmail.com
Guest
Posts: n/a
 
      01-10-2013
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
 
Reply With Quote
 
 
 
 
Peter Otten
Guest
Posts: n/a
 
      01-10-2013
http://www.velocityreviews.com/forums/(E-Mail Removed) 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()



 
Reply With Quote
 
 
 
 
Rick Johnson
Guest
Posts: n/a
 
      01-11-2013
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).
 
Reply With Quote
 
Rick Johnson
Guest
Posts: n/a
 
      01-11-2013
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).
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
TreeNode colors come from anchor colors AAaron123 ASP .Net 1 08-07-2008 07:56 PM
change bg of div1 when hovering div2 max Javascript 1 11-13-2006 07:08 PM
tkinter modifying multiple widgets with one scrollbar spohle Python 1 06-24-2006 03:30 PM
Can I change the mousepointer while hovering over datagrid? jef ASP .Net Datagrid Control 1 04-12-2005 10:57 AM



Advertisments