Не могу получить оценку, используя "индекс" в Tkinter - PullRequest
0 голосов
/ 24 января 2019

Кто-нибудь может ответить, почему в приведенном ниже коде команда self.text.mark_previous(self.text.index("insert")) работает и возвращает правильную отметку, но self.text.mark_previous("insert") возвращает tk::anchor1 вместо этого? Просто нажмите на область в тексте и нажмите кнопку.

import tkinter as tk

class Main(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.text = tk.Text()
        self.text.pack()
        self.strings = ["Region 1", "Region 2", "Region 3"]
        for text in self.strings:
            self.text.mark_set(text, "insert")
            self.text.mark_gravity(text, "left")
            self.text.insert("insert", "{}\n".format(text))
        for mark in self.strings:
            print(self.text.index(mark))
        self.button = tk.Button(text="Find Region", command=self.find_region)
        self.button.pack()

    def find_region(self):
        self.text.update_idletasks()
        region = self.text.mark_previous("insert") # This doesn't work. It returns tk::anchor1
        region2 = self.text.mark_previous(self.text.index("insert")) # This works
        print("You are in region {} {}".format(region, region2))

if __name__ == '__main__':
    main = Main()
    main.mainloop()

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Ответ таков: 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».

0 голосов
/ 24 января 2019

Поскольку имеется отметка tk::anchor# в том же индексе, что и insert, но в предыдущей позиции.

Изначально или когда указатель мыши отсутствует на каком-либо тексте, current и insertпометка с тем же индексом и в последовательности current, за которой следует insert.

Так что если вы нажмете на кнопку «Найти регион» в начале программы, она напечатает,

You are in region current Region 3

потому что по порядку отметка current находится на предыдущей позиции до отметки insert (но с тем же индексом), а отметка Region 3 - на предыдущей " index " до insertmark.

Насколько я понимаю, tkinter добавляет дополнительную отметку tk::anchor#, когда вы нажимаете текстовое поле в первый раз (пока не знаю причину), которая совпадает с индексом insertно прямо перед insert меткой (и после current, если указатель мыши не на тексте).

То есть при поиске предыдущей метки по имени метки, а не по индексу, предыдущая меткапо тому же индексу будут возвращены.Вы можете проверить это самостоятельно, добавив две определяемые пользователем метки в одном индексе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...