您可以将任意事件(鼠标、键盘、窗口管理器以及可能的其他事件)绑定到 Tkinter 中的任何小部件。
一个很好的文档位于http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm https://web.archive.org/web/20201111211515/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 函数体内引用小部件的变量将始终指向它在 lambda 函数体内的最后一个值。for
loop. functools.partial
在调用时“冻结”变量内容,并产生一个新函数。
但是,由于您将项目放置在 Canas 中,您可以为每个项目设置“fill”和“fillactive”属性,如 @mgilson 的答案,或者您可以创建一个更通用的类,不仅可以处理悬停,还可以处理您选择稍后实施的其他事件。
如果你的班级有__call__
方法,您可以将它的实例传递给bind
画布上的方法,以便为画布上的每个事件调用结果对象。在这种情况下,鼠标移动事件就足够了:
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()
(ps.画布和文本放置示例借自@mgilson的答案)