2009-10-04 5 views
1

J'écris un petit utilitaire en Python qui fait un peu de correspondance de modèle de texte. Le texte correspondant au motif saisi par l'utilisateur est surligné en jaune. J'y parviens en utilisant un widget Tkinter Text, et en mettant en place un tag sur le widget Texte nommé "match" qui donne un texte avec le nom de tag "match" un fond jaune.Comment supprimer la couleur d'arrière-plan du texte lors de la mise en évidence?

Tout cela a l'air bien, sauf lorsque j'essaie de mettre le texte en surbrillance à l'aide de la souris (par exemple lorsque je veux copier/coller). Lorsque je sélectionne le texte à l'aide de la souris, tout texte balisé contenant déjà un arrière-plan jaune conserve son arrière-plan jaune, même après avoir été mis en surbrillance. Cela signifie que vous ne pouvez pas lire correctement le texte lorsqu'il a été mis en évidence par la souris, car le texte blanc (le texte devient blanc lorsqu'il est mis en surbrillance par la souris) sur un arrière-plan jaune produit un mauvais contraste. Ce que je voudrais arriver, c'est que, lorsque je sélectionne le texte dans le widget Texte à l'aide de la souris, tout le texte obtient la couleur de fond/couleur blanche standard que vous obtiendriez normalement sur une machine Windows en mettant en évidence une section de texte.

Voici un extrait de code rapide pour démontrer ce que je veux dire:

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() 

Si vous exécutez ce, puis mettre en évidence tout le texte dans le widget texte, vous verrez que le texte avec le fond jaune devient très difficile à lire.

Notez que dans l'extrait de code ci-dessus, je l'ai essayé de changer la couleur de fond de surbrillance à l'aide:

w.config(highlightbackground="red") 

Mais cela n'a pas fonctionné.

Répondre

3

Les étiquettes ont la priorité. Les tags ayant une haute priorité ont la préférence sur ceux qui ont une priorité moindre. Lorsque vous sélectionnez une plage de texte, l'étiquette "sel" lui est attribuée. Il vous suffit d'augmenter la priorité de l'étiquette « sel » au-dessus de la priorité de votre tag « match »:

w.tag_raise("sel") 

Alex Martelli écrit dans les commentaires « il fera l'OP fait excessivement [sic] pas bon s'il met en évidence highlightbackground au lieu de selectbackground "mais c'est incorrect. Bien qu'il ait raison de dire que la mise en évidence de highlightbackground n'a rien à voir avec la sélection, cela n'a aucune incidence sur cette solution.

L'élévation de la priorité de la balise "sel" fonctionne avec le code de la question d'origine, avec ou sans l'ajout du code qui définit highlightbackground. Pour plus d'informations sur le widget texte, consultez le text widget tutorial on tkdocs.com. Il a des exemples de code dans Tcl, Python, Ruby et Perl.

+1

Alors que ce que vous écrivez est techniquement correct, il fera l'OP absolument pas bon s'il met en évidence highlightbackground au lieu de selectbackground (fondamentalement, vous avez besoin de cette réponse _plus_ le premier paragraphe de la mienne ;-). –

+0

Vous avez tort. Ma solution résout son problème avec ou sans configuration du highlightbackground ou du selectbackground. Je pense que vous m'avez voté simplement parce que je vous ai voté. La différence est, ma solution fonctionne votre non-solution ne fonctionne pas. –

+0

Je dois être d'accord avec Bryan - l'utilisation de w.tag_raise ("sel") est tout ce qui était nécessaire pour l'exemple que j'ai fourni dans la question originale. –

0

Je pense que vous devez définir selectbackground, pas highlightbackground ce qui signifie quelque chose de complètement différent (la couleur bg pour le "rectangle en surbrillance" dessiné autour d'un widget quand il obtient le focus). Cependant, je crois que le pseudo-tag sel (représentant la sélection, ce que je pense que vous appelez "le point culminant") est "ci-dessous" les balises créées par l'utilisateur telles que votre match; si c'est le cas, alors la couleur bg de la balise créée par l'utilisateur afficherait, pas la couleur bg pour le pseudo-tag sel (alias selectbackground). Avec Tk 8.5, vous pouvez remédier à cela en associant au pseudo-événement <Selection> une fonction qui place une balise utilisateur de couleur appropriée "sur le dessus" de la pseudo-étiquette sel; Cependant, il n'y a pas de tel événement dans Tk 8.4, qui est ce que vous utilisez le plus probablement aujourd'hui. TK's docs dire que 8.5 est livré avec Python 3.1 sur la distribution ActiveState de Python pour Windows; malheureusement, il n'y a que des espaces réservés "TODO" concernant d'autres plateformes ou d'autres versions de Python - je ne sais pas comment obtenir au mieux Tk 8.5 pour la ou les plate-forme (s) spécifique (s) et python.

+1

alors que ce que vous écrivez est techniquement correct, il ne résout pas réellement le problème et implique que le problème ne peut être résolu qu'avec une version spécifique de Tk. –

Questions connexes