Ответ таков: tkinter не считает "insert"
и index("insert")
точно одинаковыми при работе с метками. Они одинаковы с точки зрения просто текста, но не с точки зрения всех других данных, управляемых текстовым виджетом.
Рассмотрим текстовый виджет с текстом «Hello, world» в строке 1. Когда вы нажимаете на букву «w», происходит пара вещей: tkinter добавит метки «insert», «tk :: anchor1» и "текущий". Эти знаки заказаны. Если бы мы преобразовали содержимое текстового виджета в xml, это могло бы выглядеть примерно так:
<text index='1.0'>Hello, </text>
<mark index='1.7' id='current'/>
<mark index='1.7' id='tk::anchor1'/>
<mark index='1.7' id='insert'/>
<text index='1.7'>world</text>
При вызове mark_previous("1.7")
индекс «1.7» относится к точке непосредственно перед буквой «w», а после всех отметок. Таким образом, когда вы запрашиваете предыдущую отметку, она возвращает «вставить», поскольку это то, что находится непосредственно слева от буквы «w». Однако, если вы попросите метку, предшествующую «вставить», а не «1.7», вы получите «tk :: anchor1», так как это метка, расположенная непосредственно слева от метки «вставить».
Порядок меток и данных можно увидеть с помощью метода текстового виджета dump
. Он возвращает информацию в виде списка, а не в формате XML, но он позволяет увидеть внутреннюю структуру документа.
Продолжая в том же примере («Hello, world», после нажатия перед «w»), метод dump
возвращает следующее (для ясности я добавил новые строки):
[
('text', 'Hello, ', '1.0'),
('mark', 'current', '1.7'),
('mark', 'tk::anchor1', '1.7'),
('mark', 'insert', '1.7'),
('text', 'world\n', '1.7')
]
Как видите, отметка «current» идет перед пометкой «tk :: anchor1», которая идет перед пометкой «insert», которая идет перед буквой «w» в «world».