Приоритет тегов Tkinter - PullRequest
1 голос
/ 26 марта 2020

Я знаю, что это дубликат, но на другой вопрос не было правильного ответа, и это немного сбивало с толку

Когда вы добавляете тег в текстовый виджет tkinter, первый тег получает приоритет. Я бы предпочел, чтобы последний добавленный тег имел приоритет. В моем минимально воспроизводимом примере:

import tkinter as tk

win = tk.Tk()

txt = tk.Text(win)
txt.grid(row=0, column=0)

txt.insert('1.1', 'Hello Very Worldy World!')

txt.tag_add('tagone', '1.2', '1.4')
txt.tag_config('tagone', foreground='yellow')

txt.tag_add('tagtwo', '1.7', '1.13')
txt.tag_config('tagtwo', foreground='purple')

txt.tag_add('tagone', '1.6', '1.14')
txt.tag_config('tagone', foreground='yellow')

tk.mainloop()

Если вы запустите его, вы увидите, что пурпурная метка выходит на передний план, а не желтая метка. Есть ли способ определить приоритет тега, основываясь на хронологическом порядке, а не на том, что он использует сейчас?

1 Ответ

2 голосов
/ 26 марта 2020

Приоритет тега основан на том, когда тег создан , а не когда тег применен.

С effbot :

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

text.tag_config("n", background="yellow", foreground="red")
text.tag_config("a", foreground="blue")
text.insert(contents, ("n", "a"))

Обратите внимание, что не имеет значения, в каком порядке вы прикрепляете теги к диапазону; имеет значение порядок создания тегов.

Вы можете изменить приоритет тега, используя tag_raise и tag_lower. Если вы добавите text.tag_lower("a") в приведенный выше пример, текст станет красным.

Поскольку вы создали tagone до tagtwo, tagtwo получает приоритет. Вы можете получить ожидаемое поведение, либо присвоив третьему диапазону новое имя (tagthree), создав tagtwo перед созданием tagone или используя txt.tag_lower('tagtwo') / txt.tag_raise('tagone').

...