È il widget giusto da utilizzare per questi scopi. Il concetto di base è, si assegnano proprietà ai tag e si applicano tag a intervalli di testo nel widget. È possibile utilizzare il comando search
del widget di testo per trovare le stringhe che corrispondono al modello, che restituiranno informazioni sufficienti per applicare un tag all'intervallo corrispondente.
Per un esempio di come applicare tag al testo, vedere la risposta alla domanda Advanced Tkinter text box?. Non è esattamente quello che vuoi fare, ma mostra il concetto di base.
Di seguito è riportato un esempio di come è possibile estendere la classe Text per includere un metodo per evidenziare il testo che corrisponde a un modello.
In questo codice il modello deve essere una stringa, non può essere un'espressione regolare compilata. Inoltre, il modello deve rispettare Tcl's syntax rules for regular expressions.
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")
È il widget giusto. Guarda cosa fa ['idle'] (http://hg.python.org/cpython/file/63a00d019bb2/Lib/idlelib). – tzot
@tzot Potresti almeno dare una migliore indicazione di quali file dovresti vedere. 'idlelib' contiene molti file e moduli, ecc. ed è un po 'difficile trovare qualcosa, secondo me, senza una vera documentazione, e soprattutto se non si ha molta esperienza. Condurrò gli utenti di questo sito Web in primo luogo a questo articolo: https://docs.python.org/3.5/library/idle.html – nbro