Как получить выбранную строку из текстового поля Tkinter?

Я хотел бы получить строку из выделенной части текста, как мне это сделать?

3 ответа

Решение

Для Tkinter.Text или же Tkinter.Entry виджет, вы можете использовать:

content = text.selection_get()

Интерактивный пример получения выделенного текста как из Entry, так и из виджетов Text в консоли Python:

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

Согласно комментарию Брайана Окли:

selection_get является общим методом виджета, доступным для всех виджетов. Он не всегда получает выбранную строку из текстового виджета. Возможно, но это не гарантировано. Что он делает, так это получает то, что называется "X" выбором (от корней X11 tk). Если вы установите exportselection Ложь для виджета Текст, selection_get не сможет работать. Таким образом, ваше предложение будет работать в обычном случае, но не во всех случаях.

Виджет "Текст" имеет специальный тег с именем "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')

Использовать get метод. Если вы хотите выделенный текст, используйте индексы SEL_FIRST а также SEL_LAST,

[edit]] В одном из комментариев предполагалось, что это не сработало с 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()

Чтобы эта демонстрация работала, введите текст в текстовое поле и нажмите кнопку.

Другие вопросы по тегам