Cómo resaltar texto en un widget de texto tkinter

Quiero saber cómo cambiar el estilo de ciertas palabras y expresiones basadas en ciertos patrones.

Estoy usando el widget Tkinter.Text y no estoy seguro de cómo hacer tal cosa (la misma idea de resaltado de syntax en los editores de texto). No estoy seguro de si este es el widget correcto para usar para este propósito.

Related of "Cómo resaltar texto en un widget de texto tkinter"

Es el widget correcto para usar para estos propósitos. El concepto básico es, asigna propiedades a las tags y aplica tags a los rangos de texto en el widget. Puede usar el comando de search del widget de texto para buscar cadenas que coincidan con su patrón, lo que le devolverá suficiente información aplicando una etiqueta al rango que coincidió.

Para ver un ejemplo de cómo aplicar tags a un texto, consulte mi respuesta a la pregunta ¿Cuadro de texto Tkinter avanzado? . No es exactamente lo que quieres hacer, pero muestra el concepto básico.

A continuación se muestra un ejemplo de cómo puede extender la clase de Texto para incluir un método para resaltar texto que coincida con un patrón.

En este código, el patrón debe ser una cadena, no puede ser una expresión regular comstackda. Además, el patrón debe cumplir con las reglas de syntax de Tcl para expresiones regulares .

 class CustomText(tk.Text): '''A text widget with a new method, highlight_pattern() example: text = CustomText() text.tag_configure("red", foreground="#ff0000") text.highlight_pattern("this should be red", "red") The highlight_pattern method is a simplified python version of the tcl code at http://wiki.tcl.tk/3246 ''' def __init__(self, *args, **kwargs): tk.Text.__init__(self, *args, **kwargs) def highlight_pattern(self, pattern, tag, start="1.0", end="end", regexp=False): '''Apply the given tag to all text that matches the given pattern If 'regexp' is set to True, pattern will be treated as a regular expression according to Tcl's regular expression syntax. ''' start = self.index(start) end = self.index(end) self.mark_set("matchStart", start) self.mark_set("matchEnd", start) self.mark_set("searchLimit", end) count = tk.IntVar() while True: index = self.search(pattern, "matchEnd","searchLimit", count=count, regexp=regexp) if index == "": break if count.get() == 0: break # degenerate pattern which matches zero-length strings self.mark_set("matchStart", index) self.mark_set("matchEnd", "%s+%sc" % (index, count.get())) self.tag_add(tag, "matchStart", "matchEnd")