2010-09-23 19 views
11

Ich möchte wissen, wie Sie den Stil bestimmter Wörter und Ausdrücke basierend auf bestimmten Mustern ändern können.So markieren Sie Text in einem tkinter Text-Widget

Ich benutze die Tkinter.Text Widget und ich bin mir nicht sicher, wie man so etwas tun (die gleiche Idee der Syntax Hervorhebung in Texteditoren). Ich bin mir nicht sicher, ob dies das richtige Widget für diesen Zweck ist.

+0

Es ist das richtige Widget. Sehen Sie, was [ 'idle'] (http://hg.python.org/cpython/file/63a00d019bb2/Lib/idlelib) der Fall ist. – tzot

+0

@tzot Sie könnten zumindest einen besseren Hinweis darauf geben, welche Dateien angezeigt werden sollten. 'Idlelib' enthält viele Dateien und Module, usw., und es ist ein wenig schwierig, etwas zu finden, meiner Meinung nach, ohne eine wirkliche Dokumentation und vor allem, wenn man nicht viel Erfahrung hat. Ich werde die Benutzer dieser Website zuerst zu diesem Artikel führen: https://docs.python.org/3.5/library/idle.html – nbro

Antwort

31

Es ist das richtige Widget für diese Zwecke zu verwenden. Das grundlegende Konzept besteht darin, dass Sie Tags Tags zuweisen und Tags auf Textbereiche im Widget anwenden. Sie können die search Befehl des Text-Widgets verwenden Strings zu finden, die Ihre Muster entsprechen, die Sie genügend Informationen wenden Sie einen Tag auf den Bereich zurück, die abgestimmt.

Ein Beispiel für die Anwendung von Tags auf Text finden Sie in meiner Antwort auf die Frage Advanced Tkinter text box?. Es ist nicht genau das, was Sie tun wollen, aber es zeigt das Grundkonzept.

Im Folgenden finden Sie ein Beispiel dafür, wie Sie die Text-Klasse um eine Methode erweitern können, um Text hervorzuheben, der mit einem Muster übereinstimmt.

In diesem Code muss das Muster eine Zeichenfolge sein, es kann kein kompilierter regulärer Ausdruck sein. Außerdem muss das Muster Tcl's syntax rules for regular expressions entsprechen.

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

Danke, das hat mir immens geholfen! Kannst du mir sagen, wie ich das ändern kann, damit es reguläre Ausdrücke als Muster akzeptiert? (Wenn ich es versuche, bekomme ich 'TypeError: '_sre.SRE_Pattern' Objekt hat kein Attribut '__getitem __'') – Lastalda

+0

@Lastalda: Die Text-Widget 'search' Methode akzeptiert ein Schlüsselwortargument namens' regexp'. Wenn Sie dies auf "True" setzen, wird das Muster als regulärer Ausdruck behandelt. Ich habe meine Antwort aktualisiert, um diese Funktionalität einzuschließen. Leider ist die tkinter-spezifische Dokumentation zur 'search'-Methode etwas spärlich. Wenn Sie die offizielle tk-Dokumentation lesen, wird es ein wenig besser erklärt, obwohl Sie eine kleine mentale Übersetzung von tcl zu python machen müssen. Siehe http://tcl.tk/man/tcl8.5/TkCmd/text.htm#M120 –

+0

Vielen Dank für die Untersuchung. Aber ich bekomme immer noch den gleichen Fehler. :(Mache ich etwas falsch mit der Regexp? Ich verwende 'w.HighlightPattern (re.compile (" R \ d + ")," blau ")' und ich bekomme die Fehlerrückverfolgung 'Datei" C: \ Python27 \ lib \ lib-tk \ Tkinter.py ", Zeile 3030, in search'' if Muster und Muster [0] == '-': args.append ('-') '' TypeError: '_sre.SRE_Pattern' Objekt hat keine Attribut '__getitem __' ' – Lastalda

Verwandte Themen