как добавить функцию автоматического отступа после двоеточия в tkinter gui в python? - PullRequest
0 голосов
/ 12 марта 2020

Я создаю текстовый редактор , в котором есть все функции, но нет функции с автоматическим отступом , которая может автоматически добавлять пробелы после циклов или условий . Пожалуйста, скажите мне, как я могу сделать, и, пожалуйста, попробуйте дать код, который может это сделать. Я делаю это в Tkinter и хочу эту функцию в текстовом виджете. Я сделал этот текстовый редактор. enter image description here

Я сделал это в Tkinter, поэтому, пожалуйста, помогите мне дать код для автоматического отступа. Я пытался запускать события всякий раз, когда пользователь нажимает кнопку ':' , чтобы задать отступ в следующей строке, но он не соответствует шаблону многоуровневого отступа. как


    for i in range(100):
        if i==5:
            break
        else:
            print('got till '+str(i))

, но мой код не следует так, он только добавляет пробел в первой строке, поэтому код выглядит так.


   for i in range(100):
      if i==5:
      break
   else:
      print('got till '+str(i))

, поэтому это немного сложно. Пожалуйста, прокомментируйте любую связанную информацию или вопрос, но, пожалуйста, ответьте мне.

1 Ответ

1 голос
/ 12 марта 2020

Вам просто нужно получить отступ от текущей строки и добавить новый уровень отступа.

Вот полный рабочий пример:

import tkinter as tk
import re

root = tk.Tk()
text = tk.Text(root)
text.pack(fill="both", expand=True)

def autoindent(event):
    # the text widget that received the event
    widget = event.widget

    # get current line
    line = widget.get("insert linestart", "insert lineend")

    # compute the indentation of the current line
    match = re.match(r'^(\s+)', line)
    current_indent = len(match.group(0)) if match else 0

    # compute the new indentation
    new_indent = current_indent + 4

    # insert the character that triggered the event,
    # a newline, and then new indentation
    widget.insert("insert", event.char + "\n" + " "*new_indent)

    # return 'break' to prevent the default behavior
    return "break"

text.bind(":", autoindent)

root.mainloop()
...