Как выделить часть текста в текстовом виджете tkinter, используя индекс текста, который нужно выделить, а не индекс line.col tkinter - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь выделить часть текста в текстовом виджете tkinter.Это легко сделать, если вы знаете индекс line.col текста, который вы хотите выделить.Однако индекс текстовой части, которую я хотел бы выделить, находится в типичном формате строкового индекса (целое число), а не в формате индекса line.col, который требуется для tkinter.Ниже приведен упрощенный код, который показывает, что я пытаюсь выполнить:

from tkinter import *

class textHighlightWidget(Frame):
   def __init__(self, parent=None):
       Frame.__init__(self, parent)
       self.pack(expand=YES, fill=BOTH)
       self.makeWidgets()

    def text_for_widget(self):
        return 'This is a cat. This is a dog \n This is a cat and a 
dog. \n' \
               'This is a horse'

    def highlight_text_index(self):
        sent_beg_index = 20
        sent_end_index = 40
        self.text1.tag_add('sel', sent_beg_index, sent_end_index)

    def highlight_text_line_col(self):
        sent_beg_index = '1.0'
        sent_end_index = '2.5'
        self.text1.tag_add('sel', sent_beg_index, sent_end_index)

    def highlight_text_convert_index(self):
        sent_beg_index = 20
        sent_end_index = 40
        formatted_sent_beg_index = self.text1.index(sent_beg_index)
        formatted_sent_end_index = self.text1.index(sent_end_index)
        self.text1.tag_add('sel', formatted_sent_beg_index, 
formatted_sent_end_index)

    def makeWidgets(self):
        #self.btn1 = Button(self, text='Highlight Text', 
command=self.highlight_text_index)
        #self.btn1 = Button(self, text='Highlight Text', 
command=self.highlight_text_line_col)
        self.btn1 = Button(self, text='Highlight Text', 
command=self.highlight_text_convert_index)
        self.btn1.grid(row=0, column=0)
        self.text1 = Text(self, height=4, width=30)
        self.text1.tag_configure("center", justify='center')
        self.text1.insert('end', self.text_for_widget(), 'center')
        self.text1.grid(row=0, column=1)


if __name__ == '__main__':
    root = Tk()
    app = textHighlightWidget(root)
    root.mainloop()

У меня есть три различных определения highlight_text.Первый (highlight_text_index) использует только целочисленные индексы начального и конечного символа части текста, которую я хотел бы выделить.Когда я запускаю код с этим определением, я получаю следующую ошибку:

_tkinter.TclError: bad text index "20"

Второе определение highlight_text (highlight_text_line_col) использует формат line.col, который ожидает tkinter.Этот метод выделяет указанную часть текста, однако я не знаю, как преобразовать мои целочисленные индексы в формат индекса line.col, поэтому это второе определение highlight_text только показывает, что команда tag_add является правильной командой, но не позволяетмне выбрать желаемую часть текста для выделения.

Третье определение highlight_text (highlight_text_convert_index) использует метод текстового индекса tkinter для преобразования индекса в формат line.col, который ожидает tkinter.Мне кажется, что это должно работать, но снова я получаю то же сообщение об ошибке, которое я получил с первым определением highlight_text:

_tkinter.TclError: bad text index "20"

Если кто-нибудь знает, как выделить текст в текстовом виджете tkinter, непосредственно сформируйте целочисленную формуиндекса или как преобразовать индекс в формат line.col, которого ожидает tkinter, я был бы признателен за помощь.

1 Ответ

0 голосов
/ 13 февраля 2019

Для текстового виджета необходимо использовать формат line . col .Тем не менее, текстовый виджет поддерживает модификации базового индекса.Например, вы можете добавить + <n> characters" (или более короткое +<n>c), чтобы вычислить позицию, которая находится на расстоянии символов от базового индекса.

Таким образом, если вы хотитеиспользуйте традиционный строковый индекс, такой как '20', вы можете использовать "1.0+20c", чтобы получить 20-й символ.

...