Python:如何将Tkinter文本标记与信息关联并在事件中访问它们?

时间:2014-06-10 07:50:09

标签: python tags tkinter

我在tkinter中使用了一个Text小部件,并且像这样关联了一些标签:

textw.tag_config( "err", background="pink" );

textw.tag_bind("err", '<Motion>', self.HoverError);

基本上所有包含错误的文本都标有“err”。现在我想用hovered标签访问相关的错误消息,但我不知道如何知道哪个标签悬停。

def HoverError( self, event ):
   # Get error information

如果我可以提取悬停标签的范围,它将被解决。关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:4)

Motion event具有与之关联的属性,其中一个是鼠标的x,y坐标。 Text窗口小部件可以将这些坐标解释为索引,因此您可以抓取最接近鼠标使用tag_prevrange方法的索引的标记实例。

以下是一个例子:

def hover_over(event):

    # get the index of the mouse cursor from the event.x and y attributes
    xy = '@{0},{1}'.format(event.x, event.y)

    # find the range of the tag nearest the index
    tag_range = text.tag_prevrange('err', xy)

    # use the get method to display the results of the index range
    print(text.get(*tag_range))


root = Tk()

text = Text(root)
text.pack()

text.insert(1.0, 'This is the first error message ', 'err')
text.insert(END, 'This is a non-error message ')
text.insert(END, 'This is the second error message ', 'err')
text.insert(END, 'This is a non-error message ')
text.insert(END, 'This is the third error message', 'err')

text.tag_config('err', background='pink')
text.tag_bind('err', '<Enter>', hover_over)

root.mainloop()

如果两个标签相互碰撞,tag_prevrange方法会给你带来不必要的结果(它会寻找标签的末尾,因为它不会是一个自然的中断),但取决于如何插入Text窗口小部件,这可能不是问题。