Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #36582 > unrolled thread

How to change colors of multiple widgets after hovering in Tkinter

Started bymountdoom12@gmail.com
First post2013-01-10 10:32 -0800
Last post2013-01-10 21:43 -0800
Articles 4 — 3 participants

Back to article view | Back to comp.lang.python


Contents

  How to change colors of multiple widgets after hovering in Tkinter mountdoom12@gmail.com - 2013-01-10 10:32 -0800
    Re: How to change colors of multiple widgets after hovering in Tkinter Peter Otten <__peter__@web.de> - 2013-01-10 20:13 +0100
      Re: How to change colors of multiple widgets after hovering in Tkinter Rick Johnson <rantingrickjohnson@gmail.com> - 2013-01-10 21:43 -0800
      Re: How to change colors of multiple widgets after hovering in Tkinter Rick Johnson <rantingrickjohnson@gmail.com> - 2013-01-10 21:43 -0800

#36582 — How to change colors of multiple widgets after hovering in Tkinter

Frommountdoom12@gmail.com
Date2013-01-10 10:32 -0800
SubjectHow to change colors of multiple widgets after hovering in Tkinter
Message-ID<f393c060-3017-420a-8ead-e790d36a302d@googlegroups.com>
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 it to do.

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

PS: I would like to avoid classes.

mountDoom

[toc] | [next] | [standalone]


#36584

FromPeter Otten <__peter__@web.de>
Date2013-01-10 20:13 +0100
Message-ID<mailman.378.1357845233.2939.python-list@python.org>
In reply to#36582
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()


[toc] | [prev] | [next] | [standalone]


#36603

FromRick Johnson <rantingrickjohnson@gmail.com>
Date2013-01-10 21:43 -0800
Message-ID<c7c5029b-630f-41b6-8d56-8c51b8944168@googlegroups.com>
In reply to#36584
On Thursday, January 10, 2013 1:13:38 PM UTC-6, Peter Otten wrote:
> mountdoom wrote:
> > I´m 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).

[toc] | [prev] | [next] | [standalone]


#36604

FromRick Johnson <rantingrickjohnson@gmail.com>
Date2013-01-10 21:43 -0800
Message-ID<mailman.387.1357882989.2939.python-list@python.org>
In reply to#36584
On Thursday, January 10, 2013 1:13:38 PM UTC-6, Peter Otten wrote:
> mountdoom wrote:
> > I´m 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).

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web