如何从Python Tkinter Text小部件中获取所选文本

时间:2015-04-28 07:51:26

标签: python tkinter

我正在使用Python Tkinter开发一个基于文本的应用程序,在我的Text小部件中创建了一些单词是tag_configured,双击鼠标时,标记的单词选择显示为蓝色,如何获取此选定的文本以供进一步处理,Code如下.........

self.area.tag_configure('errorword',font=('MLU-Panini', 15,foreground="black",underline=True)

self.area.tag_bind("errorword","<Double-Button-1>",self.mouse_click,add=None)

def mouse_click(self,event):

        errorstr=self.area.get(tk.SEL_FIRST,tk.SEL_LAST)
        print("mmmmmm",errorstr)

显示错误

File "C:\Python34\lib\tkinter\__init__.py", line 3082, in get
    return self.tk.call(self._w, 'get', index1, index2)
_tkinter.TclError: text doesn't contain any characters tagged with "sel"

............................................... ........................

有人可以指导我如何解决此错误。

1 个答案:

答案 0 :(得分:2)

tobias_k mentions in his comment完全相同,执行事件绑定的顺序在这里是关键,因为您试图在实际选择文本之前获取所选文本。您可以使用bindtags()窗口小部件方法查看绑定执行的顺序。当您为文本小部件执行此操作时,您将看到类似

的内容
('.38559496', 'Text', '.', 'all')

这意味着绑定事件执行的从左到右的顺序是这样,以便评估特定小部件特有的第一个事件,然后是特定于小部件类的那些事件,然后是那些到根窗口的那些事件,最后是一切其他在应用程序级别(source)。

您的双击事件位于窗口小部件级别,因为它仅应用于该特定窗口小部件,但实际选择的文本是Text类级别的事件。因此,您必须重新排列顺序,以便类事件发生在窗口小部件事件之前。您可以通过不带参数调用bindtags来获取订单,然后通过使用包含订单的元组再次调用来定义新订单:

order = self.area.bindtags()
self.area.bindtags((order[1], order[0], order[2], order[3]))

这可确保在您尝试阅读选择之前执行文本选择。