我正在使用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"
............................................... ........................
有人可以指导我如何解决此错误。
答案 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]))
这可确保在您尝试阅读选择之前执行文本选择。