Estoy creando un editor de código y quiero crear una función de sangría cuando edito una línea sangrada. Creo una función sangrada pero no puedo crear una función de sangría.
Creé la función de dentición pero no funciona correctamente Cada vez que presiono el botón de retroceso se dibuja un rectángulo en el widget de texto:
este:-
esta es la función dedent que he creado:
def backspace(event):
widget = event.widget
line = widget.get("insert linestart", "insert lineend")
match = re.match(r'^(\s+)', line)
current_indent = len(match.group(0)) if match else 0
if current_indent == 4*(len(match.group(0))):
new_indent = current_indent - 4
widget.insert("insert", event.char + " "*new_indent)
else:
new_indent = current_indent - 1
widget.insert("insert", event.char + " "*new_indent)
este es mi código completo (no la versión corta del código completo del código real):
from tkinter import*
import re
def autoindent(event):
widget = event.widget
index = widget.index(INSERT)
index2 = "%s-%sc"%(index,1)
word = widget.get(index2,index)
line = widget.get("insert linestart", "insert lineend")
match = re.match(r'^(\s+)', line)
if word == ":":
current_indent = len(match.group(0)) if match else 0
new_indent = current_indent + 4
widget.insert("insert", event.char + "\n" + " "*new_indent)
else:
whitespace = match.group(0) if match else ""
widget.insert("insert", f"\n{whitespace}")
return "break"
def backspace(event):
widget = event.widget
line = widget.get("insert linestart", "insert lineend")
match = re.match(r'^(\s+)', line)
current_indent = len(match.group(0)) if match else 0
if current_indent == 4*(len(match.group(0))):
new_indent = current_indent - 4
widget.insert("insert", event.char + " "*new_indent)
else:
new_indent = current_indent - 1
widget.insert("insert", event.char + " "*new_indent)
root = Tk()
editor = Text(root)
editor.pack()
editor.bind("<Return>",autoindent)
editor.bind("<BackSpace>",backspace)
root.mainloop()
esto es lo que he creado:
Solución del problema
Noté que no ha definido la fuente o las pestañas en su editor.
Prueba esto.
from tkinter import font
root = tk.Tk()
TAB = 4
textfont = font.Font(family = "Consolas", size = 10)
indent = TAB * textfont.measure("M")
editor = tk.Text(
root,
font = textfont,
tabs = indent)
editor.pack()
Este enfoque evita la necesidad de una función de retroceso.
No hay comentarios.:
Publicar un comentario