2010-09-23 1 views
11

Я хочу знать, как изменить стиль определенных слов и выражений на основе определенных шаблонов.Как выделить текст в текстовом виджете tkinter

Я использую виджет Tkinter.Text, и я не уверен, как это сделать (та же идея подсветки синтаксиса в текстовых редакторах). Я не уверен, даже если это правильный виджет для использования для этой цели.

+0

Это правильный виджет. Посмотрите, что делает ['idle'] (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?. Это не совсем то, что вы хотите сделать, но оно показывает основную концепцию.

Ниже приведен пример того, как вы можете расширить класс Text, чтобы включить метод выделения текста, который соответствует шаблону.

В этом коде шаблон должен быть строкой, он не может быть скомпилированным регулярным выражением. Кроме того, шаблон должен соответствовать 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: текстовый виджет 'search' метод принимает аргумент ключевого слова с именем' regexp'. Если вы установите значение «True», шаблон будет рассматриваться как регулярное выражение. Я обновил свой ответ, чтобы включить эту функцию. К сожалению, документация tkinter по методу 'search' немного редка. Если вы читаете официальную документацию tk, это объясняется немного лучше, хотя вам нужно сделать небольшой ментальный перевод с tcl на python. См. Http://tcl.tk/man/tcl8.5/TkCmd/text.htm#M120 –

+0

Спасибо, что посмотрели на него. Но я все равно получаю ту же ошибку. :(Я делаю что-то не так с регулярным выражением? Я использую 'w.HighlightPattern (re.compile (" R \ d + ")," blue ")' и я получаю трассировку ошибок 'File 'C: \ Python27 \ lib \ lib-tk \ Tkinter.py ", строка 3030, в поиске' 'if pattern и pattern [0] == '-': args.append ('-')' 'TypeError: '_sre.SRE_Pattern' объект не имеет атрибут '__getitem __' ' – Lastalda

 Смежные вопросы

  • Нет связанных вопросов^_^