Нумерация строк в 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 таких символов два. Разное количество строк влияет на синхронизацию строк. Можно ли что-либо сделать с этим? Спасибо за любые идеи.


Ответы (0 шт):