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

17

我想从高亮文本中获取一个字符串,该怎么做?

3个回答

19

对于 Tkinter.TextTkinter.Entry 小部件,您可以使用以下代码:

content = text.selection_get()

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'
>>>

根据Bryan Oakley的评论:

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


Text小部件没有selection_get方法。 - Bryan Oakley
@BryanOakley:你用的是哪个版本?我正在使用Python 2.7附带的Tkinter,我的文本小部件肯定有selection_get。(我刚刚再次在控制台部分尝试了一下,确保它可以工作)。 - jsbueno
4
我应该更加精确:文本小部件本身没有selection_get方法。selection_get是一种通用的小部件方法,适用于所有小部件。它并不从文本小部件中获取所选字符串。可能会获取,但不保证。它获取的是所谓的“X”选择(来自tk的X11根)。如果您将文本小部件的exportselection设置为False,则selection_get将无法工作。因此,在正常情况下,您的建议将奏效,但并非在所有情况下都有效。 - Bryan Oakley

15

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')

如果您想要一个稍微更高级的解决方案,您也可以尝试:

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

3
检查是否有选定的文本,如果没有,则使用SEL_FIRST/LAST将会出错。在此加1。 - double_j

9

使用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()

为了使此演示起作用,请在文本框中输入一些文本,然后按按钮。

我在Text或Entry小部件中没有看到“sel”属性,也许你是指TCL中可用的方法,在Python中被包装成其他名称了? - jsbueno
@jsbueno: sel 不是一个属性。它是一个文本标签,代表选择,并且在 Tkinter 下可用。 - Bryan Oakley
没有必要使用Tk定义的底层字符串。Tkinter有一个用于访问它的变量 - SEL_FIRSTSEL_LAST - ArtOfWarfare
@ArtOfWarfare:我不太喜欢你的编辑。虽然你说没有理由使用底层字符串,因为有一个变量,但我认为对于具有常量字符串表示的内容来说,没有必要使用变量。 - Bryan Oakley
1
使用Tk/Tcl中的字符串的问题在于,这些字符串可能会在未来版本中更改。字符串字面量在某些版本上可以工作,在其他版本上则不行。如果您改为使用由Tkinter定义的变量(每个版本都与特定版本的Tk/Tcl紧密绑定),则保证它始终可用。此外,您不应该将Python代码与Tcl混合使用得太多。如果您没有尽可能多地使用Python,为什么要在必要时画一条线呢?为什么不只是用Tcl编写所有内容呢? - ArtOfWarfare
3
@ArtOfWarfare:这些字符串已有数十年历史,而tcl非常重视向后兼容性。它们永远不会改变的。使用这些字符串的好处是可以将使用“.first”等操作的知识转移到所有标签中,而不仅仅是选择。使用这些字符串并不是“将Python代码与tcl混合在一起”——这些字符串是正式文档化的接口。 - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接