Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #36582 > unrolled thread
| Started by | mountdoom12@gmail.com |
|---|---|
| First post | 2013-01-10 10:32 -0800 |
| Last post | 2013-01-10 21:43 -0800 |
| Articles | 4 — 3 participants |
Back to article view | Back to comp.lang.python
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
| From | mountdoom12@gmail.com |
|---|---|
| Date | 2013-01-10 10:32 -0800 |
| Subject | How 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]
| From | Peter Otten <__peter__@web.de> |
|---|---|
| Date | 2013-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]
| From | Rick Johnson <rantingrickjohnson@gmail.com> |
|---|---|
| Date | 2013-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]
| From | Rick Johnson <rantingrickjohnson@gmail.com> |
|---|---|
| Date | 2013-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