@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 (цвет текста) для стилизации линейки. Вы можете менять эти параметры по своему усмотрению, чтобы сделать нумерацию строк более удобной и красивой.