#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 был довольно простым…