Как получить выбранную строку из текстового поля 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()
Чтобы эта демонстрация работала, введите текст в текстовое поле и нажмите кнопку.