Python tkinter — автоматический отступ строки в текстовом виджете

#python #tkinter #text

Вопрос:

Я пытаюсь сделать tk.Text ttk.Text виджет или..

В котором , когда вы ударяете <TAB> , он дает отступ…

после этого..

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

пример:

введите описание изображения здесь

Ответ №1:

Для автоиндентера общего назначения, который использует любой отступ, используемый текущей строкой, включая вкладки и пробелы, вы можете получить пробелы в строке, вставить новую строку, а затем вставить те же пробелы. Сделайте это, привязав к <Return> событию.

 import tkinter as tk
import re

def auto_indent(event):
    text = event.widget

    # get leading whitespace from current line
    line = text.get("insert linestart", "insert")
    match = re.match(r'^(s )', line)
    whitespace = match.group(0) if match else ""

    # insert the newline and the whitespace
    text.insert("insert", f"n{whitespace}")

    # return "break" to inhibit default insertion of newline
    return "break"

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

text.bind("<Return>", auto_indent)

root.mainloop()
 

Комментарии:

1. Есть опечатка. Либо измените line на prev_line , либо наоборот.

2. @acw1668: спасибо, что уловил это. Я все исправил.

Ответ №2:

Подсчитайте количество ведущих вкладок "t" , затем вставьте такое же количество вкладок в следующую строку.

Вот пример:

 import tkinter as tk

def autoIndent():

    index = f"{text.index('insert')}-1l linestart"
    string = text.get(index, f"{index} lineend")
    
    tab_count = len(string)-len(string.lstrip("t"))
    text.insert("insert linestart", "t"*tab_count)

root = tk.Tk()

text = tk.Text(root)
text.bind("<Return>", lambda ev:text.after(1, autoIndent))

text.pack()

root.mainloop()
 

Комментарии:

1. ваш ответ тоже был хорошим, но ответ @Brian Oakley был довольно простым…