【问题标题】:How do I get a selected string in from a Tkinter text box?如何从 Tkinter 文本框中获取选定的字符串?
【发布时间】:2010-11-01 22:00:45
【问题描述】:

我希望能够从文本的突出显示部分中获取一个字符串,我该怎么做?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    对于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 将无法工作。因此,您的建议将在正常情况下有效,但并非在所有情况下都有效。

    【讨论】:

    • 文本小部件没有selection_get 方法。
    • @BryanOakley:您使用的是哪个版本?我正在使用 Python 2.7 附带的 Tkinter,我的文本小部件肯定有 selection_get。 (我只是在控制台部分再次尝试以确保它有效)。
    • 我应该更准确一点:文本小部件本身没有selection_get 方法。 selection_get 是可用于所有小部件的通用小部件方法。它确实 not 从文本小部件中获取选定的字符串。可能会,但不能保证。它所做的是获得所谓的“X”选择(来自 tk 的 X11 根)。如果将文本小部件的 exportselection 设置为 False,selection_get 将无法工作。因此,您的建议将在正常情况下有效,但并非在所有情况下都有效。
    【解决方案2】:

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

    【讨论】:

    • Plus1 用于检查是否有任何选定的文本开头。否则 SEL_FIRST/LAST 会出错:-)
    【解决方案3】:

    使用get 方法。如果您想要选定的文本,请使用索引 SEL_FIRSTSEL_LAST

    [edit]] 其中一位 cmets 推测这不适用于 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: sel 不是属性。它是一个代表选择的文本标签,它在 Tkinter 下可用。
    • 不需要使用 Tk 定义的底层字符串。 Tkinter 定义了一个用于访问它的变量 - SEL_FIRSTSEL_LAST
    • @BryanOakley 使用来自Tk/Tcl 的字符串的问题在于,这些字符串在未来的版本中可能会发生变化。字符串文字适用于某些版本,而不适用于其他版本。如果您改用Tkinter 定义的变量(每个版本都与Tk/Tcl 的特定版本紧密绑定),则可以保证它始终有效。此外,您不应将Python 代码与Tcl 混合使用。如果你没有尽可能多地使用Python,为什么要在你拥有的地方画线呢?为什么不把所有的东西都写在Tcl
    • @ArtOfWarfare:这些字符串已有数十年的历史,tcl 非常重视向后兼容性。他们永远不会改变。使用字符串的好处是使用“.first”等的知识可以转移到所有标签,而不仅仅是选择。使用字符串不是“将 python 代码与 tcl 混合”——字符串是文档化的接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多