如何从Tkinter文本框中获取选定的字符串?

rec*_*gle 10 python tkinter

我希望能够从突出显示的文本部分中获取字符串,我该如何解决这个问题?

jsb*_*eno 10

对于a Tkinter.TextTkinter.Entrywidget,您可以使用:

content = text.selection_get()
Run Code Online (Sandbox Code Playgroud)

从Python控制台中的Entry和Text小部件获取所选文本的交互式示例:

>>> import Tkinter
>>> w = Tkinter.Tk()
>>> e = Tkinter.Entry(w)
>>> e.pack()
>>> t = Tkinter.Text(w)
>>> t.pack()
#(scribble at the widgets in the created window, and select text in the Entry)
>>> e.selection_get()
'1234'
#(select text)
>>> t.selection_get()
'1234'
>>>
Run Code Online (Sandbox Code Playgroud)

根据布莱恩奥克利的评论:

selection_get是一个可用于所有窗口小部件的通用窗口小部件方法.它并不总是从Text小部件中获取所选字符串.它可能,但不能保证.它的作用是得到所谓的"X"选择(来自tk的X11根).如果exportselection为"文本"小部件设置为"False",selection_get则无法工作.因此,您的建议将适用于正常情况,但并非在所有情况下都适用.

  • 我应该更精确:文本小部件本身没有`selection_get`方法.`selection_get`是一个可用于所有小部件的通用小部件方法.它确实_not_从文本小部件中获取所选字符串.它可能,但不能保证.它的作用是得到所谓的"X"选择(来自tk的X11根).如果为文本小部件将`exportselection`设置为False,则`selection_get`将无法工作.因此,您的建议将适用于正常情况,但并非在所有情况下都适用. (2认同)

Bry*_*ley 8

使用该get方法.如果您希望所选文本使用索引SEL_FIRSTSEL_LAST.

[编辑]]其中一条评论推测这与Tkinter无关,因为没有属性"sel"."sel"不是属性,它是一个标签.标签是文本小部件的一个非常强大的功能.

这是一个例子:

import Tkinter as tk
import tkFont

class App:
    def __init__(self):
        root=tk.Tk()
        self.text = tk.Text(root)
        self.text.pack()
        self.button = tk.Button(root, text="Get Selection", command=self.OnButton)
        self.button.pack()
        root.mainloop()

    def OnButton(self):
        print "selected text: '%s'" % self.text.get(tk.SEL_FIRST, tk.SEL_LAST)


app=App()
Run Code Online (Sandbox Code Playgroud)

要使此演示生效,请在文本框中键入一些文本,然后按按钮.

  • @ArtOfWarfare:这些字符串已有几十年的历史,而且tcl非常重视兼容性.他们没有机会改变.使用字符串的优点是使用".first"等知识可以转移到所有标签,而不仅仅是选择.使用字符串不是"将python代码与tcl混合" - 字符串是文档化的接口. (3认同)

Gar*_*127 8

Text小部件有一个名为'sel'的特殊标签,可通过Tkinter.SEL访问,并可通过text_widget.tag_ranges(Tkinter.SEL)测试,它允许您检索"选定"文本.这是一个简单的例子:

if textWidget.tag_ranges(Tkinter.SEL):
    print('SELECTED Text is %r' % textWidget.get(Tkinter.SEL_FIRST, Tkinter.SEL_LAST))
else:
    print('NO Selected Text')
Run Code Online (Sandbox Code Playgroud)

如果您想要更高级的解决方案,您还可以尝试:

ranges = textWidget.tag_ranges(Tkinter.SEL)
if ranges:
    print('SELECTED Text is %r' % textWidget.get(*ranges))
else:
    print('NO Selected Text')
Run Code Online (Sandbox Code Playgroud)

  • Plus1用于检查是否有任何选定的文本开头.否则SEL_FIRST/LAST会出错:-) (2认同)