Как сделать нумерацию строк для текстового поля в tkinter?

Пользователь

от yasmine , в категории: Python , 6 месяцев назад

Как сделать нумерацию строк для текстового поля в tkinter?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от abel , 6 месяцев назад

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


Пример выше демонстрирует базовую реализацию нумерации строк. Вы можете настроить внешний вид линейки, изменить отступы и т.д. в соответствии с вашими потребностями.

Пользователь

от cayla , 14 дней назад

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