Как убрать существующий фоновый цвет текста при выделении? - PullRequest
1 голос
/ 04 октября 2009

Я пишу небольшую утилиту на Python, которая выполняет сопоставление с шаблоном текста. Текст, соответствующий шаблону, введенному пользователем, выделяется желтым цветом.

Я добиваюсь этого с помощью виджета Tkinter Text и настраиваю тег на виджете «Текст» с именем "match", который дает любому тексту с именем тега "match" желтый фон.

Это все выглядит хорошо, за исключением случаев, когда я пытаюсь выделить текст с помощью мыши (например, когда требуется скопировать / вставить). Когда я выделяю текст с помощью мыши, любой помеченный текст, у которого уже есть желтый фон, сохраняет свой желтый фон даже после выделения. Это означает, что вы не можете правильно читать текст, когда он выделен мышью, поскольку белый текст (текст выделяется белым при выделении мышью) на желтом фоне обеспечивает плохую контрастность.

Я бы хотел, чтобы при выделении текста в виджете «Текст» с помощью мыши весь текст получал стандартный синий цвет фона / белый текст, который вы обычно получаете на компьютере с Windows при выделение фрагмента текста.

Вот небольшой фрагмент кода, демонстрирующий, что я имею в виду:

from tkinter import *

root = Tk()

w = Text(root)
w.tag_config("match",background="yellow")
w.config(highlightbackground="red")
w.pack()
w.insert(INSERT,"some non-matching text.")
w.insert(INSERT,"some matching text.","match")

root.mainloop()

Если вы запустите это, а затем выделите весь текст в виджете «Текст», вы увидите, что текст с желтым фоном становится очень трудночитаемым.

Обратите внимание, что в приведенном выше фрагменте кода я попытался изменить цвет фона подсветки с помощью:

w.config(highlightbackground="red")

Но это не сработало.

Ответы [ 2 ]

3 голосов
/ 04 октября 2009

Теги имеют приоритет. Теги с высоким приоритетом имеют преимущество перед теми, которые имеют более низкий приоритет. При выборе диапазона текста ему присваивается тег «sel». Вам просто нужно повысить приоритет тега sel, чтобы он был выше приоритета тега match:

w.tag_raise("sel")

Алекс Мартелли пишет в комментариях: «Он будет делать ОП абсолютно бесполезно, если он устанавливает backlight background вместо select background», но это неверно. Хотя он прав, что установка highlightbackground не имеет никакого отношения к выделению, это не имеет отношения к этому решению.

Повышение приоритета тега "sel" работает с кодом в исходном вопросе, с добавлением или без добавления кода, который устанавливает highlightbackground.

Для получения дополнительной информации о текстовом виджете ознакомьтесь с руководством по текстовому виджету на tkdocs.com . Он имеет примеры кода на Tcl, Python, Ruby и Perl.

0 голосов
/ 04 октября 2009

Я думаю, вам нужно установить selectbackground, а не highlightbackground, что означает нечто совершенно иное (цвет bg для "прямоугольника выделения", нарисованного вокруг виджета, когда он получает фокус). Тем не менее, я считаю, что псевдотег sel (представляющий выделение, которое, как я думаю, вы называете «основным моментом») находится «под» созданными пользователем тегами, такими как ваш match; если это так, то будет отображаться цвет bg для созданного пользователем тега, а не цвет bg для псевдо-тега sel (он же selectbackground).

С помощью Tk 8.5 вы могли бы исправить это, связав с псевдо-событием <Selection> функцию, которая помещает соответствующий цветной пользовательский тег «поверх» псевдотега sel; однако в Tk 8.4 такого события нет, что, скорее всего, вы используете сегодня. Документы TK говорят, что 8.5 поставляется с Python 3.1 в дистрибутиве ActiveState Python для Windows; к сожалению, есть только заполнители "TODO" относительно других платформ или других версий Python - я не знаю, как наилучшим образом получить Tk 8.5 для конкретной платформы (платформ) и версий (версий) Python, которые вас интересуют.

...