【问题标题】:How to get selected text from Python Tkinter Text widget如何从 Python Tkinter Text 小部件中获取选定的文本
【发布时间】:2015-07-06 22:52:36
【问题描述】:

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

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"

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

谁能指导我如何解决这个错误。

【问题讨论】:

  • 你应该看看 Tkinter StringVar ;)
  • @ArthurVaïsse 不,他不应该看 StringVar。
  • StringVar 不知道选择了什么
  • 因此,您双击单词,触发回调......同时,双击选择/突出显示当前单词(在文本字段中通常)。可能是在选择文本之前执行了回调吗?只是猜测......

标签: python tkinter


【解决方案1】:

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

('.38559496', 'Text', '.', 'all')

这意味着绑定事件执行的顺序是从左到右,以便首先评估此特定小部件特有的事件,然后评估小部件类特有的事件,然后是根窗口的事件,最后是所有事件否则在应用程序级别 (source)。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多