2010-09-23 19 views
11

Desidero sapere come modificare lo stile di determinate parole ed espressioni in base a determinati modelli.Come evidenziare il testo in un widget di testo tkinter

Sto utilizzando il widget Tkinter.Text e non sono sicuro di come fare una cosa del genere (la stessa idea dell'evidenziazione della sintassi negli editor di testo). Non sono sicuro, anche se questo è il widget giusto da utilizzare per questo scopo.

+0

È il widget giusto. Guarda cosa fa ['idle'] (http://hg.python.org/cpython/file/63a00d019bb2/Lib/idlelib). – tzot

+0

@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

risposta

31

È 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") 
+0

Grazie, questo mi ha aiutato immensamente! Puoi dirmi come cambiarlo in modo che accetti le espressioni regolari come modelli, però? (Quando provo, ottengo l'oggetto 'TypeError: '_sre.SRE_Pattern' non ha attributo '__getitem __'') – Lastalda

+0

@Lastalda: il metodo 'search' del widget di testo accetta un argomento di parole chiave chiamato' regexp'. Se lo imposti a 'True' il pattern sarà trattato come un'espressione regolare. Ho aggiornato la mia risposta per includere questa funzionalità. Sfortunatamente la documentazione specifica di tkinter sul metodo 'search' è un po 'scarna. Se leggi la documentazione ufficiale di tk, è spiegato un po 'meglio, anche se devi fare una piccola traduzione mentale da tcl a python. Vedi http://tcl.tk/man/tcl8.5/TkCmd/text.htm#M120 –

+0

Grazie per averci consultato. Ma ho ancora lo stesso errore. :(Sto facendo qualcosa di sbagliato con il regexp? Io uso 'w.HighlightPattern (re.compile (" R \ d + ")," blue ")' e ottengo il traceback errore 'File" C: \ Python27 \ lib \ lib-tk \ Tkinter.py ", riga 3030, nella ricerca' 'if pattern and pattern [0] == '-': args.append ('-')' 'TypeError: '_sre.SRE_Pattern' l'oggetto non ha attributo '__getitem __' ' – Lastalda

Problemi correlati