Как убрать существующий цвет фона текста при выделении?

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

Я добиваюсь этого с помощью виджета Tkinter Text и устанавливаю тег в виджете 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")

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


person Bryce Thomas    schedule 04.10.2009    source источник


Ответы (2)


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

w.tag_raise("sel")

Алекс Мартелли пишет в комментариях, что «он не сделает OP абсолютно [sic] бесполезным, если он установит подсветку фона вместо selectbackground», но это неверно. Хотя он прав в том, что установка подсветки фона не имеет ничего общего с выбором, она не имеет отношения к этому решению.

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

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

person Bryan Oakley    schedule 04.10.2009
comment
Хотя то, что вы пишете, технически правильно, это совершенно бесполезно для OP, если он устанавливает подсветку фона вместо selectbackground (в основном вам нужен этот ответ плюс мой первый абзац ;-). - person Alex Martelli; 04.10.2009
comment
Вы не правы. Мое решение решает его проблему с настройкой подсветки или фона выбора или без нее. Я думаю, вы проголосовали против меня просто потому, что я против вас. Разница в том, что мое решение работает, а ваше нерешение - нет. - person Bryan Oakley; 04.10.2009
comment
Я должен согласиться с Брайаном - использование w.tag_raise (sel) - это все, что требовалось для примера, который я привел в исходном вопросе. - person Bryce Thomas; 05.10.2009

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

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

person Alex Martelli    schedule 04.10.2009
comment
Хотя то, что вы пишете, технически правильно, на самом деле это не решает проблему и подразумевает, что проблема может быть решена только с определенной версией Tk. - person Bryan Oakley; 04.10.2009