Python 使用Tkinter将鼠标悬停在文本上时更改文本颜色?

Python 使用Tkinter将鼠标悬停在文本上时更改文本颜色?,python,tkinter,Python,Tkinter,因此,我在Tkinter的画布上有一堆文本,我想让它在鼠标悬停在文本上时,文本颜色发生变化。就我的一生而言,我不知道该怎么做,而且似乎在任何地方都没有太多关于Tkinter的信息 for city in Cities: CityText = Cities[i] board.create_text(CityLocs[CityText][0], CityLocs[CityText][1], text=CityText, fill="white") CityText = Cit

因此,我在Tkinter的画布上有一堆文本,我想让它在鼠标悬停在文本上时,文本颜色发生变化。就我的一生而言,我不知道该怎么做,而且似乎在任何地方都没有太多关于Tkinter的信息

for city in Cities:
    CityText = Cities[i]
    board.create_text(CityLocs[CityText][0], CityLocs[CityText][1], text=CityText, fill="white")
    CityText = Cities[i]
    i = i + 1
这只是我将文本放在画布上的代码,尽管我不确定还需要发布什么来表达我的观点。Tkinter中没有“hover”功能或类似的功能吗?

这里有一个(无可否认)在OS-X上运行的非常蹩脚的例子

from Tkinter import *

master=Tk()
canvas=Canvas(master)
canvas.pack()
canvas.create_text((20,20),activefill="red",text="Hello World!",fill="black")
master.mainloop()

参考资料:

您可以将任意事件(鼠标、键盘、窗口管理器等)绑定到Tkinter中的任何小部件

这方面的一个很好的文档位于-

例如,要在鼠标悬停在小部件上时将颜色更改绑定到小部件,请执行以下操作:

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()

(注:画布和文本放置示例借用@mgilson的答案)

这已经内置到Tkinter中。创建文本时,请使用“activefill”选项指定所需的颜色

有关更多信息,请参阅以下链接。Effbot.org/tkinterbook是我去tkinter的地方。

您可能希望添加标记和/或将ID存储到正在创建的文本对象中,以便以后可以访问它们,但这并不坏,但只适用于画布对象内部的文本元素-画布外部的任意小部件没有“fill”或“activefill”属性。@jsbueno:当然,正如您所指出的,bind更适用于一般情况。(这也是我的第一个想法…),但他询问了画布上的文本元素,这比绑定任意事件要简单得多。另外,您可以将事件绑定到由create\u text方法生成的item\u句柄吗?如果没有,跟踪光标下的文本元素的任务就变得更加困难了。是的,您可以,
item=canvas.create_text(…);canvas.tag\u bind(项“”,回调)
。此外,正如Joel的评论所建议的,您可以向所有相应的项添加标记
create_text(…,tag=“city_name”)
,并对该标记执行绑定。@FabienAndre
tag_bind
。很高兴知道。谢谢不客气。绝对是命名不好的方法,因为它使用项目引用或标记名…如果
网格
几何体管理器足以放置文本,这是一个很好的答案…我想
位置
几何体管理器也可以使用…但这很快就会变得难看,我想…@mgilson:的确-事实上,OP确实需要画布——这个新的例子应该以一种更通用的方式来涵盖它。(当我第一次编写答案时,我认为有一个culd将事件绑定到画布项目——实际上需要一些事件管理器将事件重新分发到项目,如第二个示例中的类)我没有测试它,但它看起来非常可靠。我的一个保留意见是,看起来您的类总是会选择一个要用on_颜色着色的项目(只要光标仍在画布上)。如果标签足够稀疏,有时可能希望它们都不处于活动状态(例如,如果光标不够近),或者如果光标离开(虽然这可能是一个更容易的修复方法,但可以将上一个_项的颜色设置为off_color,并在绑定到“”的方法中将其设置为none)。绑定项上的
/
事件可能更简单(而不是
和重新实现类的拾取)@FabienAndre:这是我的第一个想法,但我没有找到在画布项上绑定事件的方法-你知道怎么做吗?
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()