Puede enlazar eventos arbitrarios (ratón, teclado, gestor de ventanas y posiblemente otros) a cualquier widget en Tkinter.
Una documentación agradable para que sea al http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm -
Por ejemplo, para enlazar los cambios de color a los widgets cuando Pase el ratón sobre ellos:
import Tkinter
from functools import partial
def color_config(widget, color, event):
widget.configure(foreground=color)
parent = Tkinter.Tk()
text = Tkinter.Label(parent, text="Hello Text")
text.bind("<Enter>", partial(color_config, text, "red"))
text.bind("<Leave>", partial(color_config, text, "blue"))
text.pack()
Tkinter.mainloop()
El uso de functools.partial
aquí le permite volver a utilizar una variable para su widget de texto (Etiqueta), ya que los agrega a una lista. Si uno se conforma con simplemente usar lambda, tendría una sorpresa desagradable, ya que la variable que hace referencia al widget en el cuerpo de la función lambda siempre apuntaría al último valor que tenía dentro del bucle for
. functools.partial
"congelar" el contenido variable en el momento en que se lo llama y produce una nueva función.
Sin embargo, como está colocando los elementos en un Canas, puede establecer los atributos "fill" y "fillactive" para cada elemento, como en la respuesta de @ mgilson, o puede crear una clase más genérica para manejar solo flotando, pero otros eventos eliges implementar más tarde.
Si su clase tiene un método __call__
, puede pasar una instancia de la misma al método bind
del lienzo, de modo que se llame al objeto resultante para cada evento en el lienzo. En este caso, evento de ratón de movimiento suficiente: (. Ps ejemplo, la colocación de la lona y el texto tomado de la respuesta de @ mgilson)
from Tkinter import *
class Follower(object):
def __init__(self,on_color="#fff", off_color="#000"):
self.on_color = on_color
self.off_color = off_color
self.previous_item = None
def hover(self, canvas, item, x, y):
x1, y1, x2, y2 = canvas.bbox(item)
if x1 <= x <= x2 and y1 <= y <= y2:
return True
return False
def __call__(self, event):
canvas = event.widget
item = canvas.find_closest(event.x, event.y)
hovering = self.hover(canvas, item, event.x, event.y)
if (not hovering or item != self.previous_item) and self.previous_item is not None:
canvas.itemconfig(self.previous_item, fill=self.off_color)
if hovering:
canvas.itemconfig(item, fill=self.on_color)
self.previous_item = item
master=Tk()
canvas=Canvas(master)
canvas.pack()
canvas.create_text((40,20),text="Hello World!",fill="black")
canvas.create_text((60,80),text="FooBar",fill="black")
canvas.bind("<Motion>", Follower())
master.mainloop()
Es posible que desee añadir etiquetas y/o almacenar los identificadores de los objetos de texto que está creando para que pueda acceder a ellos más tarde –