Нумерация строк в Tkinter Text()
С примерами решений Оукли и другими я знаком. Но мне интересно самому попытаться решить этот вопрос. У меня есть код:
import tkinter as tk
root = tk.Tk()
root.title("Текстовый редактор")
scrollbar = tk.Scrollbar()
scrollbar.pack(side='right', fill='y')
text_widget = tk.Text(root)
text_widget.pack(side="right", expand=True, fill="both")
text_widget.focus_set()
line_numbers = tk.Text(root, bg="#f0f0f0", fg='black', width=4, bd=0, highlightthickness=0)
line_numbers.pack(side="left", fill="y")
def on_update(event):
line_numbers.delete(1.0, "end")
lines = text_widget.get(1.0, "end").split("\n")
print("text_widget= ", lines)
for i, lines in enumerate(lines, 1):
line_numbers.insert("end", str(i)+'\n')
def on_delete(event):
ndex=text_widget.index('insert')
dex=ndex.split('.')[-1]
if int(dex) == 0 and float(ndex) != 1.0:
end_str=line_numbers.get("end-1l", "end")
if end_str == '\n':
line_numbers.delete("end-1c", "end")
line_numbers.delete("end-1l", "end")
else: line_numbers.delete("end-1l", "end")
else: return
def on_return(event):
end_line=line_numbers.get("end-1l", "end")
if end_line == '\n':
line=line_numbers.get(1.0, "end").split('\n')
print("line_numbers= ", line)
count=enumerate(line, 1)
num_str=int(line[-3])+1
print(num_str)
line_numbers.insert("end", str(num_str)+'\n')
else:
line_numbers.insert("end", '\n')
line=line_numbers.get(1.0, "end").split('\n')
count=enumerate(line, 1)
num_str=int(line[-3])+1
line_numbers.insert("end", str(num_str)+'\n')
def on_scrollbar(*args):
'''прокручивает оба текста при скроллинге'''
line_numbers.yview(*args)
text_widget.yview(*args)
def on_textscroll(*args):
'''передача аргумента скроллинга'''
scrollbar.set(*args)
on_scrollbar('moveto', args[0])
text_widget.bind("<<Modified>>", on_update)
text_widget.bind("<Return>", on_return)
text_widget.bind("<BackSpace>", on_delete)
scrollbar['command'] = on_scrollbar
line_numbers['yscrollcommand'] = on_textscroll
text_widget['yscrollcommand'] = on_textscroll
root.mainloop()
Но строки в line_numbers и в text_widget не синхронизированы по высоте. При распечатке строк можно видеть:
text_widget= ['wu', '']
line_numbers= ['1', '2', '', '']
3
line_numbers= ['1', '2', '3', '', '']
4
Т.е. в text_widget у нас один спецсимвол, а в line_numbers таких символов два. Разное количество строк влияет на синхронизацию строк. Можно ли что-либо сделать с этим? Спасибо за любые идеи.