2009-10-04 2 views
1

Я пишу небольшую утилиту в 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") 

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

ответ

3

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

w.tag_raise("sel") 

Алекс Мартелли пишет в комментариях «не будет делать OP absoluely [так] ничего хорошего если он устанавливает outbackground вместо selectbackground ", но это неверно. Хотя он прав, что установка highlightbackground не имеет ничего общего с выбором, оно не влияет на это решение.

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

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

+1

В то время как то, что вы пишете, технически корректно, оно сделает OP абсолютно нехорошим, если он устанавливает highlightbackground вместо selectbackground (в основном вам нужен этот ответ _plus_ первый абзац моего ;-). –

+0

Вы неверны. Мое решение решает его проблему с настройкой подсветки backbackground или selectbackground или без нее. Думаю, вы проголосовали за меня просто потому, что я вниз, - проголосовал за вас. Разница в том, что мое решение работает на вашем не-решении. –

+0

Я должен согласиться с Брайаном - использование w.tag_raise («sel») - это все, что требовалось для примера, представленного в исходном вопросе. –

0

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

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

+1

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

 Смежные вопросы

  • Нет связанных вопросов^_^