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

时间:2012-04-20 02:05:03

标签: 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 = Cities[i]
    i = i + 1

这只是我将文本放在画布上的代码,虽然我不确定还有什么可以发布我的观点。是否没有'悬停'功能或类似于Tkinter内置的功能?

3 个答案:

答案 0 :(得分:3)

这是一个(不可否认)非常蹩脚的例子,适用于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()

参考:http://effbot.org/tkinterbook/canvas.htm

答案 1 :(得分:2)

您可以将任意事件(鼠标,键盘,窗口管理器和其他可能的事件)绑定到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函数体中的widget的变量总是指向它在for循环中的最后一个值。 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的答案)

答案 2 :(得分:1)

这已经内置到Tkinter中。在创建文本时使用“activefill”选项指定您想要的颜色。

有关详细信息,请参阅以下链接。 Effbot.org/tkinterbook是我去tkinter的。 http://effbot.org/tkinterbook/canvas.htm#Tkinter.Canvas.create_text-method