Python scrolledtext нумерация строк

Нумерация строк, tkinter

я пытаюсь сделать нумерацию строк в текстовом редакторе. Я нашёл код на нумерацию строк от Брайана Окли и я попробовал его задействовать в своем коде. Вот тут я запутался, теперь я не понимаю как сделать чтобы нумерация строк была в одном текстовом поле. Вот код:

from tkinter import * from tkinter import filedialog, ttk import tkinter as tk from lines import TextLineNumbers, CustomText, Example import os title = 'Notepad' root = Tk() root.geometry('800x600') root.title(title) tabs = tab_list = [] # Example(root).pack(side="top", fill="both", expand=True) notebook = ttk.Notebook(root) # -------------------- def open_file(): textWidget = Text(root) file = open(filedialog.askopenfilename(), 'r') title = os.path.basename(file.name) tab = add_tab(title) root.title(title + " - Notepad") data = file.read() tab.textWidget.delete(1.0, "end") tab.textWidget.insert(1.0, data) file.close() def add_tab(name): notebook.pack(expand=True, fill='both') tab = Tab(notebook, name) print(name) notebook.add(tab, text=name) tab_list.append(tab) return tab def save_file(): tab_to_save = get_tab() print(tab_to_save) tab_to_save.save_tab() def get_tab(): print(notebook.index('current')) #Get the tab object from the tab_list based on the index of the currently selected tab tab = tab_list[notebook.index('current')] return tab def generate_tab(): if tabs['ky'] < 20: tabs['ky'] += 1 add_tab('Document ' + str(tabs['ky'])) def run(): root.mainloop() # -------------------- menubar = Menu(root) filemenu = Menu(menubar, tearoff=0) filemenu.add_command(label="New. ", command= generate_tab) filemenu.add_command(label="Open", command = open_file) filemenu.add_command(label="Save", command= save_file) filemenu.add_separator() filemenu.add_command(label="Exit", command= root.quit) menubar.add_cascade(label="File", menu = filemenu) editmenu = Menu(menubar, tearoff=0) editmenu.add_command(label="Undo") editmenu.add_command(label="Redo") menubar.add_cascade(label="Edit", menu=editmenu) root.config(menu=menubar) class Tab(Frame): def __init__(self, root, name): Frame.__init__(self, root) self.root = root self.name = name self.textWidget = Text(self, font = "DejaVuSansMono 10", fg = "#111") self.textWidget["bg"] = "#fff" self.textWidget.pack(fill='both', expand=True) def save_tab(self): print(self.textWidget.get("1.0", 'end-1c')) file = open(filedialog.asksaveasfilename() + '.txt', 'w+') file.write(self.textWidget.get("1.0", 'end-1c')) print(os.path.basename(file.name)) #title = os.path.basename(file.name) file.close() # -------------------- if __name__ == '__main__': print("done!") run() 

введите сюда описание изображения

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

Нужно создавать CustomText внутри вашего таба вместо Text , там же привязывать панель с номерами строк, и добавить скроллбар, все по аналогии с кодом из класса Example :

class Tab(Frame): def __init__(self, root, name): Frame.__init__(self, root) self.root = root self.name = name # Текстовое поле self.textWidget = CustomText(self, font = "DejaVuSansMono 10", fg = "#111", bg = "#fff") # Панель с номерами строк linenumbers = TextLineNumbers(self, width=30) linenumbers.attach(self.textWidget) # Перерисовка панели с номерами при изменениях в текстовом виджете def on_change(event): linenumbers.redraw() self.textWidget.bind(">", on_change) self.textWidget.bind("", on_change) # Вертикальная полоса прокрутки vsb = tk.Scrollbar(self, orient="vertical", command=self.textWidget.yview) self.textWidget.configure(yscrollcommand=vsb.set) # Размещаем панель номеров слева, полосу прокрутки справа, # потом уже текстовое поле на оставшемся месте между ними linenumbers.pack(side="left", fill="y") vsb.pack(side="right", fill="y") self.textWidget.pack(fill='both', expand=True) 

Сравните с классом Example из ответа:

class Example(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) self.text = CustomText(self) self.vsb = tk.Scrollbar(orient="vertical", command=self.text.yview) self.text.configure(yscrollcommand=self.vsb.set) self.text.tag_configure("bigfont", font=("Helvetica", "24", "bold")) self.linenumbers = TextLineNumbers(self, width=30) self.linenumbers.attach(self.text) self.vsb.pack(side="right", fill="y") self.linenumbers.pack(side="left", fill="y") self.text.pack(side="right", fill="both", expand=True) self.text.bind(">", self._on_change) self.text.bind("", self._on_change) . def _on_change(self, event): self.linenumbers.redraw() 

Все примерно то же самое, только я не стал делать панель номеров и сколлбар полями объекта Tab , и немного по-другому организовал код.

Читайте также:  Php set defined variable

Источник

Text – многострочное текстовое поле

В этом уроке рассмотрим, как с помощью Tkinter запрограммировать такой элемент интерфейса как многострочное текстовое поле. Этот виджет часто встречается при заполнении веб-форм. В приложениях для десктопов он редок, если не считать программы "Терминал", где по-сути вы работаете в большом текстовом поле.

В tkinter многострочное текстовое поле создается от класса Text . По умолчанию его размер равен 80-ти знакоместам по горизонтали и 24-м по вертикали.

Размер текстового поля

Однако эти свойства можно изменять с помощью опций width и height . Есть возможность конфигурировать шрифт, цвета и другое.

from tkinter import * root = Tk() text = Text(width=25, height=5, bg="darkgreen", fg='white', wrap=WORD) text.pack() root.mainloop()

Свойства виджета Text

Значение WORD опции wrap позволяет переносить слова на новую строку целиком, а не по буквам.

Text и Scrollbar

Если в текстовое поле вводится больше линий текста, чем его высота, то оно само будет прокручиваться вниз. При просмотре прокручивать вверх-вниз можно с помощью колеса мыши и стрелками на клавиатуре. Однако бывает удобнее пользоваться скроллером – полосой прокрутки. Кроме того его появление, или когда он становится активным, делает очевидным, что контент превышает размеры поля.

В tkinter скроллеры производятся от класса Scrollbar . Объект-скроллер связывают с виджетом, которому он требуется. Это не обязательно многострочное текстовое поле. Часто полосы прокрутки бывают нужны спискам, которые будут рассмотрены позже.

from tkinter import * root = Tk() text = Text(width=20, height=7) text.pack(side=LEFT) scroll = Scrollbar(command=text.yview) scroll.pack(side=LEFT, fill=Y) text.config(yscrollcommand=scroll.set) root.mainloop()

Text и Scrollbar

Здесь создается скроллер, к которому с помощью опции command привязывается прокрутка текстового поля по оси y – text.yview . В свою очередь текстовому полю опцией yscrollcommand устанавливается ранее созданный скроллер – scroll.set .

Читайте также:  Php namespace require include

Методы Text

Основные методы у Text такие же как у Entry – это get , insert , delete . Однако, если в случае однострочного текстового поля было достаточно указать один индекс позиции при вставке или удалении, то в случае многострочного надо указывать два – номер строки и номер символа в этой строке (другими словами, номер столбца). При этом нумерация строк начинается с единицы, а столбцов – с нуля.

from tkinter import * def insert_text(): s = "Hello World" text.insert(1.0, s) def get_text(): s = text.get(1.0, END) label['text'] = s def delete_text(): text.delete(1.0, END) root = Tk() text = Text(width=25, height=5) text.pack() frame = Frame() frame.pack() Button(frame, text="Вставить", command=insert_text).pack(side=LEFT) Button(frame, text="Взять", command=get_text).pack(side=LEFT) Button(frame, text="Удалить", command=delete_text).pack(side=LEFT) label = Label() label.pack() root.mainloop() 

Методы текстового поля

Методы get и delete могут принимать не два, а один аргумент. В таком случае будет обрабатываться только один символ в указанной позиции.

Теги

Особенностью текстового поля библиотеки Tk является возможность форматировать текст в нем, то есть придавать его разным частям разное оформление. Делается это с помощью методов tag_add и tag_config . Первый добавляет тег, при этом надо указать его произвольное имя и отрезок текста, к которому он будет применяться. Метод tag_config настраивает тегу стили оформления.

from tkinter import * root = Tk() text = Text(width=50, height=10) text.pack() text.insert(1.0, "Hello world!\nline two") text.tag_add('title', 1.0, '1.end') text.tag_config('title', justify=CENTER, font=("Verdana", 24, 'bold')) root.mainloop()

Добавление тегов

Вставка виджетов в текстовое поле

В Text можно вставлять другие виджеты помощью метода window_creat . Потребность в этом не велика, однако может быть интересна с объектами типа Canvas . Данный класс будет изучен позже. В примере ниже вставляется метка в текущую ( INSERT ) позицию курсора.

from tkinter import * def smile(): label = Label(text=":)", bg="yellow") text.window_create(INSERT, window=label) root = Tk() text = Text(width=50, height=10) text.pack() button = Button(text=":)", command=smile) button.pack() root.mainloop()

Метод window_create

Определение метки в теле функции позволяет каждый раз при вызове последней создавать новую метку. Иначе, если бы метка была в основной ветке программы, предыдущая исчезала бы.

Читайте также:  Ioncube loader php fpm

Практическая работа

Напишите программу, состоящую из однострочного и многострочного текстовых полей и двух кнопок "Открыть" и "Сохранить". При клике на первую должен открываться на чтение файл, чье имя указано в поле класса Entry , а содержимое файла должно загружаться в поле типа Text .

При клике на вторую кнопку текст, введенный пользователем в экземпляр Text , должен сохраняться в файле под именем, которое пользователь указал в однострочном текстовом поле.

Файлы будут читаться и записываться в том же каталоге, что и файл скрипта, если указывать имена файлов без адреса.

Для выполнения практической работы вам понадобится функция open языка Python и методы файловых объектов чтения и записи. Освежить знания о них можно здесь.

Пример приложения Tkinter

Курс с примерами решений практических работ: pdf-версия

Tkinter. Программирование GUI на Python

Источник

Оцените статью