Создает ли tkinter tag_add один тег, когда диапазоны перекрываются? - PullRequest
0 голосов
/ 07 апреля 2020

Я пишу простое приложение, которое имеет функцию поиска с использованием tkinter. Я успешно реализовал функцию поиска, но обнаружил, что, когда она находит два поля поиска, которые находятся рядом друг с другом (например, между ними нет пробелов), и я добавляю тег подсветки для обоих полей, создается впечатление, что tkinter объединяет два tag_add записей в одном диапазоне. Вот пример кода, который демонстрирует это:

import tkinter as tk
from tkinter import *

root = tk.Tk()
T = tk.Text(root, height=10, width=50)
T.pack()
string = """This is some example text
This is some more example text
In this line exampleexample occurs twice
This is the last example line"""
T.insert(tk.END, string)
find_length = IntVar()
pos = T.search("example", "1.0", stopindex=END, count=find_length, nocase=1)
while pos:
    print ("pos = ", pos)
    print("length =", find_length.get())
    end = "%s+%sc" % (pos, find_length.get())
    print ("end =", end, "\n")
    T.tag_add('highlight', pos, end)
    T.tag_configure('highlight', foreground ='red')
    pos = T.search("example", end, stopindex=END, count=find_length, nocase=1)

print (T.tag_ranges('highlight'))

tk.mainloop()

Вывод этого примера кода выглядит следующим образом:

pos =  1.13
length = 7
end = 1.13+7c 

pos =  2.18
length = 7
end = 2.18+7c 

pos =  3.13
length = 7
end = 3.13+7c 

pos =  3.20
length = 7
end = 3.20+7c 

pos =  4.17
length = 7
end = 4.17+7c 

(<textindex object: '1.13'>, <textindex object: '1.20'>, <textindex object: '2.18'>, <textindex object: '2.25'>, <textindex object: '3.13'>, <textindex object: '3.27'>, <textindex object: '4.17'>, <textindex object: '4.24'>)

А вот ссылка на результаты: Пример тега Tkinter

Как видите, я сделал tag_add для каждого результата поиска. Но результат для «exampleexample» в третьей строке был объединен в один диапазон 3.13 - 3.27.

Я предполагаю, что это работает так, как задумано. Но подумал, что я спрошу сообщество, может быть, я что-то упускаю из виду или делаю неправильно.

Заранее спасибо.

1 Ответ

0 голосов
/ 07 апреля 2020

Я предполагаю, что это работает как задумано.

Вы правы, ваш пример работает как задумано.

Теги не являются объектами, это атрибуты, назначенные диапазону символов 1 . После добавления тега tkinter по существу забывает, как был добавлен тег. Если вы вызываете tag_add десять раз для 10 последовательных символов или вызываете один раз для диапазона из 10 символов, конечный результат один и тот же - tkinter просто знает, что эти 10 символов имеют одинаковый тег.

Это это сколько программ работает. Например, когда я ищу «пример» на этой веб-странице в chrome, exampleexample выделяется, как если бы это было одно совпадение.

screenshot


1 Это не совсем правильно. Тег также является объектом, управляемым текстовым виджетом. Однако независимо от того, сколько диапазонов текста имеют определенный тег, существует только один экземпляр каждого тега. Этот единственный объект тега используется для хранения значений конфигурации для этого тега.

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