gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:03:14 24 4
gpt4 key购买 nike

所以我在 Tkinter 的 Canvas 上有一堆文本,我想制作它以便当鼠标悬停在文本上时文本颜色会发生变化。对于我的生活,我不知道该怎么做,而且似乎没有很多关于 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

这只是我将文本放置在 Canvas 上的代码,尽管我不确定还应该发布什么来表达我的观点。 Tkinter 中是否没有内置“悬停”功能或类似功能?

最佳答案

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

一个很好的文档在 http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm -

例如,当鼠标悬停在小部件上时将颜色变化绑定(bind)到小部件:

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__ 方法,您可以将它的一个实例传递给 Canvas 的bind 方法,以便为每个事件调用生成的对象在 Canvas 上。在这种情况下,鼠标移动事件就足够了:

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. Canvas 和文本放置示例借自@mgilson的回答)

关于python - 使用 Tkinter 将鼠标悬停在文本上时更改文本颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10239292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com