@yasmine
Чтобы сделать нумерацию строк для текстового поля в tkinter, можно использовать виджет Text и добавить к нему TextUndo.
Вот пример кода, который демонстрирует нумерацию строк:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import tkinter as tk
from tkinter import Text, LEFT, Y
class TextWithLineNumber(tk.Frame):
def __init__(self, master=None, *args, **kwargs):
super().__init__(master, *args, **kwargs)
self.text = Text(self)
self.text.pack(side=LEFT, fill='y')
self.linenumbers = Text(self, width=4, state='disabled')
self.linenumbers.pack(side=LEFT, fill='y')
self.text.bind('<KeyPress>', self.update_linenumbers)
self.text.bind('<Button-1>', self.update_linenumbers)
self.text.bind('<Control-KeyPress>', self.update_linenumbers)
self.text.bind('<Control-Button-1>', self.update_linenumbers)
self.text.bind('<MouseWheel>', self.update_linenumbers)
self.update_linenumbers()
def update_linenumbers(self, event=None):
self.linenumbers.config(state='normal')
self.linenumbers.delete('1.0', 'end')
line_count = self.text.get('1.0', 'end').count('
')
linenumbers_text = '
'.join(str(i) for i in range(1, line_count + 2))
self.linenumbers.insert('1.0', linenumbers_text)
self.linenumbers.config(state='disabled')
root = tk.Tk()
text_with_linenumbers = TextWithLineNumber(root)
text_with_linenumbers.pack()
root.mainloop()
|
В этом примере создается класс TextWithLineNumber, который является подклассом класса tk.Frame. В методе __init__ создается экземпляр виджета Text и добавляется линейка (виджет Text с выключенным состоянием). Затем, в методе update_linenumbers, нумерация строк обновляется каждый раз, когда пользователь изменяет текст в поле.
Пример выше демонстрирует базовую реализацию нумерации строк. Вы можете настроить внешний вид линейки, изменить отступы и т.д. в соответствии с вашими потребностями.
@yasmine
Дополнительно, чтобы улучшить внешний вид нумерации строк, можно стилизовать виджет линейки (linenumbers). Например, можно изменить шрифт, цвет текста, цвет фона и другие параметры.
Вот пример, как можно настроить стиль линейки в приведенном выше коде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
class TextWithLineNumber(tk.Frame):
def __init__(self, master=None, *args, **kwargs):
super().__init__(master, *args, **kwargs)
self.text = Text(self)
self.text.pack(side=LEFT, fill='y')
self.linenumbers = Text(self, width=4, state='disabled', font=("Courier", 10), bg='lightgray', fg='black')
self.linenumbers.pack(side=LEFT, fill='y')
self.text.bind('<KeyPress>', self.update_linenumbers)
self.text.bind('<Button-1>', self.update_linenumbers)
self.text.bind('<Control-KeyPress>', self.update_linenumbers)
self.text.bind('<Control-Button-1>', self.update_linenumbers)
self.text.bind('<MouseWheel>', self.update_linenumbers)
self.update_linenumbers()
def update_linenumbers(self, event=None):
self.linenumbers.config(state='normal')
self.linenumbers.delete('1.0', 'end')
line_count = self.text.get('1.0', 'end').count('
')
linenumbers_text = '
'.join(str(i) for i in range(1, line_count + 2))
self.linenumbers.insert('1.0', linenumbers_text)
self.linenumbers.config(state='disabled')
root = tk.Tk()
text_with_linenumbers = TextWithLineNumber(root)
text_with_linenumbers.pack()
root.mainloop()
|
В этом примере я добавил параметры font, bg (цвет фона) и fg (цвет текста) для стилизации линейки. Вы можете менять эти параметры по своему усмотрению, чтобы сделать нумерацию строк более удобной и красивой.