单击时执行功能的 Tkinter 文本,在光标悬停时突出显示

Tkinter text that executes functions on click, highlights when cursor hovers

我正在使用什么Tkinter

我想要的: 创建一个带有关键字的文本,当光标悬停在它们上面时会突出显示,并在您单击它时执行绑定到它们的功能。以后我打算给这些词绑定额外的信息

我现在看起来如何:我发现最接近的是当鼠标悬停在 Label 中并单击文本时如何调用函数bind() 函数(如 bind("<Enter>", red_text))。但是这样我就没有办法改变一个特定的词。另外,如果事实证明做我想做的唯一方法是为每个句子和关键字创建单独的 Labels,然后将它们也放置,那么我不确定如何制作它更简单

为了我所需要的和我期望看到的:我希望能写小说文字,后面会确定关键词。这些关键字在激活后将为它们提供预先创建的答案选项

一个更具说明性的例子:

文本:Hello, world!,其中主要文本显示为非粗体和 斜体,关键字相反 - 粗体 和非斜体。字体为白色

关键字:“world” - 绑定了变化的函数和return原始颜色(取决于光标是否指向它)和更复杂的函数,单击时,会在单独的 window(最初包含标准答案)

中提供答案选择

按下关键字前的回答选项:

1. Hi!

之后:

1. What world?
2. The world is me?
3. Who are you talking to?

您可以在 <Motion> 上创建绑定,以便在鼠标移动时调用函数。在回调中,您可以使用 "@x,y" 等索引找到光标下字符的索引,并从中获取单词。

然后您可以在该词上添加一个标签,设置一些标记以帮助您在回调中找到该词,并在点击小部件时调用函数的标签进行绑定。

这是一个例子:

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, width=80, height=10)
label = tk.Label(root, text="")

label.pack(side="bottom", fill="y")
text.pack(fill="both", expand=True)

text.tag_configure("keyword", background="black", foreground="white")
text.insert("end", "Hello, world!\nThis has another hidden keyword\n")

keywords = ["world", "another"]
def hover(event):
    text = event.widget
    keyword_start = text.index(f"@{event.x},{event.y} wordstart")
    keyword_end = text.index(f"@{event.x},{event.y} wordend")
    word = text.get(keyword_start, keyword_end)

    text.tag_remove("keyword", "1.0", "end")

    if word in keywords:
        text.mark_set("keyword_start", keyword_start)
        text.mark_set("keyword_end", keyword_end)
        text.tag_add("keyword", keyword_start, keyword_end)

def keyword_click(event):
    text = event.widget
    word = text.get("keyword_start", "keyword_end")
    label.configure(text=f"you clicked on the word '{word}'")

text.bind("<Motion>", hover)
text.tag_bind("keyword", "<1>", keyword_click)

root.mainloop()