2010-09-23 6 views
11

में टेक्स्ट को हाइलाइट करने के लिए कैसे मैं कुछ पैटर्न के आधार पर कुछ शब्दों और अभिव्यक्तियों की शैली को बदलने के बारे में जानना चाहता हूं।एक tkinter टेक्स्ट विजेट

मैं Tkinter.Text विजेट का उपयोग कर रहा हूं और मुझे यकीन नहीं है कि ऐसी चीज कैसे करें (पाठ संपादकों में सिंटैक्स हाइलाइटिंग का एक ही विचार)। मुझे यकीन नहीं है कि यह इस उद्देश्य के लिए उपयोग करने का सही विजेट भी है।

+0

यह सही विजेट है। देखें कि ['निष्क्रिय '] (http://hg.python.org/cpython/file/63a00d019bb2/Lib/idlelib) करता है। – tzot

+0

@tzot आप कम से कम एक बेहतर संकेत दे सकते हैं कि किसी को कौन सी फाइलें देखना चाहिए। 'idlelib' में कई फाइलें और मॉड्यूल इत्यादि शामिल हैं, और मेरी राय में, वास्तविक दस्तावेज के बिना, और अधिकतर यदि किसी के पास अधिक अनुभव नहीं है, तो कुछ ढूंढना मुश्किल है। मैं इस वेबसाइट के उपयोगकर्ताओं को पहले इस आलेख में ले जाऊंगा: https://docs.python.org/3.5/library/idle.html – nbro

उत्तर

31

इन उद्देश्यों के लिए उपयोग करने का यह सही विजेट है। मूल अवधारणा यह है कि, आप टैग को गुण निर्दिष्ट करते हैं, और आप विजेट में टेक्स्ट की श्रेणियों पर टैग लागू करते हैं। आप टेक्स्ट पैटर्न के search कमांड का उपयोग अपने पैटर्न से मेल खाने वाले तारों को ढूंढने के लिए कर सकते हैं, जो आपको पर्याप्त जानकारी लौटाएंगे जो मिलान की सीमा तक एक टैग लागू करते हैं।

पाठ पर टैग कैसे लागू करें के उदाहरण के लिए, Advanced Tkinter text box? पर मेरा उत्तर देखें। यह वही नहीं है जो आप करना चाहते हैं लेकिन यह मूल अवधारणा को दिखाता है।

एक उदाहरण है कि आप टेक्स्ट क्लास को कैसे बढ़ा सकते हैं ताकि एक पैटर्न से मेल खाने वाले टेक्स्ट को हाइलाइट करने के लिए विधि शामिल हो।

इस कोड में पैटर्न एक स्ट्रिंग होना चाहिए, यह एक संकलित नियमित अभिव्यक्ति नहीं हो सकता है। साथ ही, पैटर्न को 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

धन्यवाद, इससे मुझे बहुत मदद मिली है! क्या आप मुझे बता सकते हैं कि इसे कैसे बदला जाए ताकि यह नियमित रूप से अभिव्यक्तियों को पैटर्न के रूप में स्वीकार कर सके? (जब मैं कोशिश करता हूं, मुझे 'TypeError:' _sre.SRE_Pattern 'ऑब्जेक्ट में कोई विशेषता नहीं है' __getitem __ '') – Lastalda

+0

@Lastalda: टेक्स्ट विजेट' खोज' विधि 'regexp' नामक एक कीवर्ड तर्क स्वीकार करती है। यदि आप इसे 'True' पर सेट करते हैं तो पैटर्न को नियमित अभिव्यक्ति के रूप में माना जाएगा। मैंने इस कार्यक्षमता को शामिल करने के लिए अपना उत्तर अपडेट कर लिया है। दुर्भाग्य से 'खोज' विधि पर tkinter- विशिष्ट दस्तावेज थोड़ा विचित्र है। यदि आप आधिकारिक टीके दस्तावेज पढ़ते हैं तो इसे थोड़ा बेहतर समझाया जाता है, हालांकि आपको टीसीएल से पायथन तक एक छोटा मानसिक अनुवाद करना पड़ता है। Http://tcl.tk/man/tcl8.5/TkCmd/text.htm#M120 –

+0

इसे देखने के लिए धन्यवाद देखें। लेकिन मुझे अभी भी वही त्रुटि मिलती है। :(क्या मैं regexp के साथ कुछ गलत कर रहा हूं? मैं 'w.HighlightPattern (re.compile ("R \ d +"), "blue") का उपयोग करता हूं और मुझे त्रुटि ट्रेसबैक' फ़ाइल "सी मिलती है: \ Python27 \ lib \ lib-tk \ Tkinter.py ", लाइन 3030, खोज में' 'यदि पैटर्न और पैटर्न [0] == '-': args.append ('-')' 'TypeError: '_sre.SRE_Pattern' ऑब्जेक्ट में नहीं है विशेषता '__getitem __' ' – Lastalda