Python Tkinter文本小部件-在事件函数中使用单击的文本

Python Tkinter文本小部件-在事件函数中使用单击的文本,python,python-3.x,tkinter,textbox,Python,Python 3.x,Tkinter,Textbox,我目前有一个日志解析器,它将用户信息放入文本小部件中。如果插入到文本小部件中的一行具有关键字,则该行将以蓝色突出显示。如果单击该行,我希望在执行的事件函数中使用该行中的文本 因为我正在使用标记的配置将线条涂成蓝色,所以我不能同时复制单击的文本吗 代码示例: from tkinter import * def callback(event): window = Toplevel() window.overrideredirect(1) window.geometry("

我目前有一个日志解析器,它将用户信息放入文本小部件中。如果插入到文本小部件中的一行具有关键字,则该行将以蓝色突出显示。如果单击该行,我希望在执行的事件函数中使用该行中的文本

因为我正在使用标记的配置将线条涂成蓝色,所以我不能同时复制单击的文本吗

代码示例:

from tkinter import *


def callback(event):
    window = Toplevel()
    window.overrideredirect(1)
    window.geometry("200x100+{0}+{1}".format(event.x_root-1, event.y_root-12))
    label = Label(window, justify="left", text="Username: value \nLocation: value \nAddress: value \nSecurity Level: value")
    label.grid()
    window.bind("<Leave>", lambda e: window.destroy())

root = Tk()
text = Text(root)
text.insert(END, "Click here", "tag")
text.pack()
text.tag_config("tag", foreground="blue")
text.tag_bind("tag", "<Button-1>", callback)

root.mainloop()

如何获取单击的用户名并在函数中使用它?我只想将用户名设置为一个变量并使用它,我只是不知道怎么做

您不应该创建Tk的第二个实例。如果需要弹出窗口,请创建Toplevel的实例。您也不需要再次调用mainloop


您可以使用单击的x,y坐标获取单击的索引。例如:text.index@%d,%d%event.x,event.y

您可以对每个单击的文本使用单独的标记,然后将其作为参数发送给绑定函数

import tkinter as tk


def callback(event, tag):
    print(event.widget.get('%s.first'%tag, '%s.last'%tag))

root = tk.Tk()

text = tk.Text(root)
text.pack()

text.tag_config("tag1", foreground="blue")
text.tag_bind("tag1", "<Button-1>", lambda e:callback(e, "tag1"))
text.insert(END, "first link", "tag1")

text.insert(END, " other text ")

text.tag_config("tag2", foreground="blue")
text.tag_bind("tag2", "<Button-1>", lambda e:callback(e, "tag2"))
text.insert(END, "second link", "tag2")

root.mainloop()
编辑:

我找到了如何转换鼠标位置和查找单击的标记,这样就不需要单独的标记


我把我在其他线程中复制的东西放在一起,我没有注意到Tk的第二个主循环或第二个实例。通常不会这么做,但谢谢你指出。我会修正这个例子。获取索引会给我单词的位置,但如何选择单词将其设置为变量?@sidnical:您将标记sel添加到您想要选择的任何区域。我必须准备回调3到4次,以了解它到底在做什么。这可以处理我需要的一切。谢谢你的帮助。
import tkinter as tk


def callback(event):
    # get the index of the mouse click
    index = event.widget.index("@%s,%s" % (event.x, event.y))

    # get the indices of all "adj" tags
    tag_indices = list(event.widget.tag_ranges('tag'))

    # iterate them pairwise (start and end index)
    for start, end in zip(tag_indices[0::2], tag_indices[1::2]):
        # check if the tag matches the mouse click index
        if event.widget.compare(start, '<=', index) and event.widget.compare(index, '<', end):
            # return string between tag start and end
            print(start, end, event.widget.get(start, end))

root = tk.Tk()

text = tk.Text(root)
text.pack()

text.tag_config("tag", foreground="blue")
text.tag_bind("tag", "<Button-1>", callback)

text.insert(END, "first link", "tag")

text.insert(END, " other text ")

text.insert(END, "second link", "tag")

root.mainloop()