2010-09-23 65 views
11

Tôi muốn biết cách thay đổi kiểu của các từ và biểu thức nhất định dựa trên các mẫu nhất định.Cách đánh dấu văn bản trong một tiện ích văn bản tkinter

Tôi đang sử dụng tiện ích Tkinter.Text và tôi không chắc chắn cách thực hiện một việc như vậy (cùng một ý tưởng về đánh dấu cú pháp trong trình chỉnh sửa văn bản). Tôi không chắc chắn ngay cả khi đây là tiện ích thích hợp để sử dụng cho mục đích này.

+0

Đây là tiện ích phù hợp. Xem những gì ['nhàn rỗi'] (http://hg.python.org/cpython/file/63a00d019bb2/Lib/idlelib). – tzot

+0

@tzot Ít nhất bạn có thể đưa ra một chỉ dẫn tốt hơn về những tệp mà người ta sẽ thấy. 'idlelib' chứa nhiều tệp và mô-đun, v.v. và có một chút khó khăn khi tìm một cái gì đó, theo ý kiến ​​của tôi, không có tài liệu thực sự, và chủ yếu là nếu một người không có nhiều kinh nghiệm. Tôi sẽ dẫn đầu người dùng của trang web này trước tiên cho bài viết này: https://docs.python.org/3.5/library/idle.html – nbro

Trả lời

31

Đó là tiện ích phù hợp để sử dụng cho các mục đích này. Khái niệm cơ bản là, bạn gán các thuộc tính cho các thẻ, và bạn áp dụng các thẻ cho các phạm vi văn bản trong widget. Bạn có thể sử dụng lệnh search của tiện ích con văn bản để tìm chuỗi phù hợp với mẫu của bạn, điều này sẽ trả lại cho bạn đủ thông tin áp dụng thẻ cho phạm vi phù hợp.

Ví dụ về cách áp dụng thẻ cho văn bản, hãy xem câu trả lời của tôi cho câu hỏi Advanced Tkinter text box?. Nó không chính xác những gì bạn muốn làm nhưng nó cho thấy khái niệm cơ bản.

Sau đây là ví dụ về cách bạn có thể mở rộng lớp Văn bản để bao gồm phương pháp đánh dấu văn bản khớp với mẫu.

Trong mã này mẫu phải là một chuỗi, nó không thể là biểu thức chính quy được biên dịch. Ngoài ra, mẫu phải tuân theo 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

Cảm ơn, điều này đã giúp tôi vô cùng! Bạn có thể cho tôi biết làm thế nào để thay đổi điều này để nó chấp nhận các biểu thức chính quy như là các khuôn mẫu, mặc dù? (Khi tôi thử, tôi nhận được đối tượng 'TypeError: '_sre.SRE_Pattern' không có thuộc tính '__getitem __'') – Lastalda

+0

@Lastalda: phương thức 'search' của tiện ích văn bản chấp nhận một đối số từ khóa có tên là' regexp'. Nếu bạn đặt giá trị này thành 'True', mẫu sẽ được coi là cụm từ thông dụng. Tôi đã cập nhật câu trả lời của mình để bao gồm chức năng này. Thật không may tài liệu tkinter cụ thể về phương pháp 'tìm kiếm' là một chút thưa thớt. Nếu bạn đọc tài liệu chính thức của tk nó được giải thích tốt hơn một chút, mặc dù bạn phải làm một bản dịch nhỏ về tinh thần từ tcl thành python. Xem http://tcl.tk/man/tcl8.5/TkCmd/text.htm#M120 –

+0

Cảm ơn bạn đã xem xét nó. Nhưng tôi vẫn gặp lỗi tương tự. :(Tôi có làm gì sai với regexp không? Tôi sử dụng 'w.HighlightPattern (re.compile (" R \ d + ")," blue ")' và tôi nhận được lỗi traceback 'File" C: \ Python27 \ lib \ lib-tk \ Tkinter.py ", dòng 3030, trong tìm kiếm' nếu mẫu và mẫu [0] == '-': args.append ('-') '' LoạiError: '_sre.SRE_Pattern' đối tượng không có thuộc tính '__getitem __' ' – Lastalda

Các vấn đề liên quan