可以綁定任意事件(鼠標,鍵盤,窗口管理器和其它可能的)到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