Создание блокнота на python

Статьи

Введение

Создадим свой блокнот на python с использованием графического фреймворка tkinter.

В блокноте будет возможность сменить тему, шрифт, а так же открывать уже существующие txt-файлы, сохранять и создавать новые.

Создание окна блокнота

Для начала создадим импортируем всё что нам нужно, и создадим окно tkinter. Добавим заголовок и разрешение окна.

from tkinter import *
from tkinter import messagebox
from tkinter import filedialog

root = Tk()
# Заголовок
root.title('Блокнот')
# Разрешение окна
root.geometry('600x700')

root.mainloop()

Наполнение окна

Добавление виджета Frame

Добавим то, для чего по сути и создан блокнот, а именно текстовое поле, в котором можно будет что-то писать. Для этого мы создадим виджет Frame и расположения его в окне методом pack().

# Создание Frame
f_text = Frame(root)
# Расположение виджета Frame в окне
f_text.pack(fill=BOTH, expand=1)

Свойство fill=BOTH — заполнение всего окна

Свойство expand=1 — расширение

Текстовое поле

Для добавления текстового поля воспользуемся виджетом Text и расположения его в окне методом pack().

text_fild = Text(f_text,
                 bg='black',
                 fg='lime',
                 padx=10,
                 pady=10,
                 wrap=WORD,
                 insertbackground='brown',
                 selectbackground='#8D917A',
                 spacing3=10,
                 width=30,
                 font='Arial 14 bold'
                 )
text_fild.pack(expand=1, fill=BOTH, side=LEFT)

bg — цвет фона

fg — цвет текста

padx — добавление отступов по X

pady — добавление отступов по Y

wrap — обёртывание текста

insertbackground — цвет курсора

selectbackground — цвет выделения текста

spacing3 — отступы между абзацами

width — ширина строки

font — шрифт, его размер и начертание

Далее нужно добавить scrollbar для удобного пролистывания текста вниз и вверх.

# Создание Виджета Scrollbar
scroll = Scrollbar(f_text, command=text_fild.yview)
# Расположение виджета Scrollbar в окне
scroll.pack(side=LEFT, fill=Y)
# Привязка Scrollbar к текстовому полю
text_fild.config(yscrollcommand=scroll.set)

Добавлению меню

Для начала применим класс Menu к нашему окну root.

main_menu = Menu(root) # Привязываем класс Menu к root

В нашем меню будет две вкладки: «Файл» и «Вид».

Во вкладке «Файл» будут находиться выпадающее меню «Открыть» (открыть файл), «Сохранить» (сохранить файл) и «Закрыть» (закрыть файл).

Во вкладке «Вид» будет находиться выпадающее меню «Тема» (выбор одной из темы) и «Шрифт» (выбор шрифта).

# Файл
file_menu = Menu(main_menu, tearoff=0)
file_menu.add_command(label='Открыть')
file_menu.add_command(label='Сохранить')
file_menu.add_separator()
file_menu.add_command(label='Закрыть')

# Вид
view_menu = Menu(main_menu, tearoff=0)
view_menu_sub = Menu(view_menu, tearoff=0)
font_menu_sub = Menu(view_menu, tearoff=0)

# Выпадающий список с темами
view_menu_sub.add_command(label='Тёмная')
view_menu_sub.add_command(label='Светлая')
view_menu.add_cascade(label='Тема', menu=view_menu_sub)

# Выпадающий список со шрифтами
font_menu_sub.add_command(label='Arial')
font_menu_sub.add_command(label='Comic Sans MS')
font_menu_sub.add_command(label='Times New Roman')
view_menu.add_cascade(label='Шрифт...', menu=font_menu_sub)

# Добавление списков меню
main_menu.add_cascade(label='Файл', menu=file_menu)
main_menu.add_cascade(label='Вид', menu=view_menu)
root.config(menu=main_menu)

Добавление тем и шрифтов

Для добавления тёмной и светлой тем, создадим словарь с вложенными словарями. Основной словарь будет хранить в себе название тем, а они в свою очередь будут хранить параметры тем.

# Темы
view_colors = {
    'dark': {
        'text_bg': 'black', 'text_fg': 'lime', 'cursor': 'brown', 'select_bg': '#8D917A'
    },
    'light': {
        'text_bg': 'white', 'text_fg': 'black', 'cursor': '#A5A5A5', 'select_bg': '#FAEEDD'
    }
}

Проделаем то же самое со шрифтами:

# Шрифты
fonts = {
    'Arial': {
        'font': 'Arial 14 bold'
    },
    'CSMS': {
        'font': ('Comic Sans MS', 14, 'bold')
    },
    'TNR': {
        'font': ('Times New Roman', 14, 'bold')
    }
}

Создание функций

Добавим функции, чтобы задействовать все пункты созданного ранее меню.

# Изменение тем
def chenge_theme(theme):
    text_fild['bg'] = view_colors[theme]['text_bg']
    text_fild['fg'] = view_colors[theme]['text_fg']
    text_fild['insertbackground'] = view_colors[theme]['cursor']
    text_fild['selectbackground'] = view_colors[theme]['select_bg']


# Изменение шрифтов
def chenge_fonts(fontss):
    text_fild['font'] = fonts[fontss]['font']


# Выход
def notepad_exit():
    answer = messagebox.askokcancel('Выход', 'Вы точно хотите выйти?')
    if answer:
        root.destroy()

# Открыть файл
def open_file():
    file_path = filedialog.askopenfilename(title='Выбор файла', filetypes=(('Текстовые документы (*.txt)', '*.txt'), ('Все файлы', '*.*')))
    if file_path:
        text_fild.delete('1.0', END)
        text_fild.insert('1.0', open(file_path, encoding='utf-8').read())

# Сохранить файл
def save_file():
    file_path = filedialog.asksaveasfilename(filetypes=(('Текстовые документы (*.txt)', '*.txt'), ('Все файлы', '*.*')))
    f = open(file_path, 'w', encoding='utf-8')
    text = t.get('1.0', END)
    f.write(text)
    f.close()

Привязка команд в меню

Осталось привязать созданные функции к пунктам меню и блокнот готов:

# Файл
file_menu = Menu(main_menu, tearoff=0)
file_menu.add_command(label='Открыть', command=open_file)
file_menu.add_command(label='Сохранить', command=save_file)
file_menu.add_separator()
file_menu.add_command(label='Закрыть', command=notepad_exit)
root.config(menu=file_menu)

# Вид
view_menu = Menu(main_menu, tearoff=0)
view_menu_sub = Menu(view_menu, tearoff=0)
font_menu_sub = Menu(view_menu, tearoff=0)
view_menu_sub.add_command(label='Тёмная', command=lambda: chenge_theme('dark'))
view_menu_sub.add_command(label='Светлая', command=lambda: chenge_theme('light'))
view_menu.add_cascade(label='Тема', menu=view_menu_sub)

font_menu_sub.add_command(label='Arial', command=lambda: chenge_fonts('Arial'))
font_menu_sub.add_command(label='Comic Sans MS', command=lambda: chenge_fonts('CSMS'))
font_menu_sub.add_command(label='Times New Roman', command=lambda: chenge_fonts('TNR'))
view_menu.add_cascade(label='Шрифт...', menu=font_menu_sub)
root.config(menu=view_menu)

# Добавление списков меню
main_menu.add_cascade(label='Файл', menu=file_menu)
main_menu.add_cascade(label='Вид', menu=view_menu)
root.config(menu=main_menu)

Код

Весь код:

from tkinter import *
from tkinter import messagebox
from tkinter import filedialog


def chenge_theme(theme):
    text_fild['bg'] = view_colors[theme]['text_bg']
    text_fild['fg'] = view_colors[theme]['text_fg']
    text_fild['insertbackground'] = view_colors[theme]['cursor']
    text_fild['selectbackground'] = view_colors[theme]['select_bg']


def chenge_fonts(fontss):
    text_fild['font'] = fonts[fontss]['font']


def notepad_exit():
    answer = messagebox.askokcancel('Выход', 'Вы точно хотите выйти?')
    if answer:
        root.destroy()


def open_file():
    file_path = filedialog.askopenfilename(title='Выбор файла', filetypes=(('Текстовые документы (*.txt)', '*.txt'), ('Все файлы', '*.*')))
    if file_path:
        text_fild.delete('1.0', END)
        text_fild.insert('1.0', open(file_path, encoding='utf-8').read())


def save_file():
    file_path = filedialog.asksaveasfilename(filetypes=(('Текстовые документы (*.txt)', '*.txt'), ('Все файлы', '*.*')))
    f = open(file_path, 'w', encoding='utf-8')
    text = text_fild.get('1.0', END)
    f.write(text)
    f.close()


root = Tk()
root.title('Текстовый редактор')
root.geometry('600x700')
root.iconbitmap('notepad.ico')

main_menu = Menu(root)

# Файл
file_menu = Menu(main_menu, tearoff=0)
file_menu.add_command(label='Открыть', command=open_file)
file_menu.add_command(label='Сохранить', command=save_file)
file_menu.add_separator()
file_menu.add_command(label='Закрыть', command=notepad_exit)
root.config(menu=file_menu)

# Вид
view_menu = Menu(main_menu, tearoff=0)
view_menu_sub = Menu(view_menu, tearoff=0)
font_menu_sub = Menu(view_menu, tearoff=0)
view_menu_sub.add_command(label='Тёмная', command=lambda: chenge_theme('dark'))
view_menu_sub.add_command(label='Светлая', command=lambda: chenge_theme('light'))
view_menu.add_cascade(label='Тема', menu=view_menu_sub)

font_menu_sub.add_command(label='Arial', command=lambda: chenge_fonts('Arial'))
font_menu_sub.add_command(label='Comic Sans MS', command=lambda: chenge_fonts('CSMS'))
font_menu_sub.add_command(label='Times New Roman', command=lambda: chenge_fonts('TNR'))
view_menu.add_cascade(label='Шрифт...', menu=font_menu_sub)
root.config(menu=view_menu)

# Добавление списков меню
main_menu.add_cascade(label='Файл', menu=file_menu)
main_menu.add_cascade(label='Вид', menu=view_menu)
root.config(menu=main_menu)

f_text = Frame(root)
f_text.pack(fill=BOTH, expand=1)

view_colors = {
    'dark': {
        'text_bg': 'black', 'text_fg': 'lime', 'cursor': 'brown', 'select_bg': '#8D917A'
    },
    'light': {
        'text_bg': 'white', 'text_fg': 'black', 'cursor': '#A5A5A5', 'select_bg': '#FAEEDD'
    }
}

fonts = {
    'Arial': {
        'font':'Arial 14 bold'
    },
    'CSMS': {
        'font': ('Comic Sans MS', 14, 'bold')
    },
    'TNR': {
        'font': ('Times New Roman', 14, 'bold')
    }
}

text_fild = Text(f_text,
                 bg='black',
                 fg='lime',
                 padx=10,
                 pady=10,
                 wrap=WORD,
                 insertbackground='brown',
                 selectbackground='#8D917A',
                 spacing3=10,
                 width=30,
                 font='Arial 14 bold'
                 )
text_fild.pack(expand=1, fill=BOTH, side=LEFT)

scroll = Scrollbar(f_text, command=text_fild.yview)
scroll.pack(side=LEFT, fill=Y)
text_fild.config(yscrollcommand=scroll.set)

root.mainloop()

Заключение

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

Надеюсь Вам понравилась статья, удачи! 🙂

Admin
Admin
IT Start
Добавить комментарий