可以绑定任意事件(鼠标,键盘,窗口管理器和其它可能的)到Tkinter中的任何小部件。
为一个不错的文件是在http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm -
例如,结合颜色变为小部件时,鼠标悬停在他们:
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()
采用functools.partial
在这里,您可以重新使用您的文本(标签)小部件的变量,因为您将它们附加到列表中。如果你愿意简单地使用lambda表达式,那么你会有一个令人厌恶的惊喜,因为引用lambda函数主体中的部件的变量总是指向它在for
循环内的最后一个值。 functools.partial
在被调用时“冻结”变量内容,并产生一个新函数。
但是,由于您将项目放置在Canas中,因此您可以为每个项目设置“fill”和“fillactive”属性,如@ mgilson的答案,或者可以创建更通用的类来处理不只有悬停,但您选择稍后执行的其他事件。
如果您的课程有__call__
方法,您可以将其实例传递给画布的bind
方法,以便为画布上的每个事件调用结果对象。在这种情况下,鼠标移动事件足以:(PS。从@ 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()
您可能希望添加标记和/或将ID存储到您正在创建的文本对象中,以便稍后可以访问它们 – 2012-04-20 02:23:26