Приложение A – Диаграмма классов
Приложение B – Исходный код приложения
#импорт модулей библиотеки для создания интерфейса и возможности использования стандартных методов
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
QApplication, QWidget, QPushButton, QLabel,
QListWidget, QLineEdit, QTextEdit, QInputDialog,
QHBoxLayout, QVBoxLayout
)
#для хранения данных используем json-файл
import json
#создаем заготовку: новый список, в котором заранее хранится самая первая заметка-приветствие
notes = {
'Добро пожаловать':{
'текст' : 'Это самое лучшее приложение для заметок в мире!',
'теги' : ['добро','инструкция']
}
}
#открываем json-файл для чтения
with open("notes_data.json", "w") as file:
json.dump(notes, file, ensure_ascii = False)
#создаем объект "Приложение"
app = QApplication([])
#создаем элементы интерфейса
my_win = QWidget()
my_win.setWindowTitle('Умные заметки')
my_win.resize(900, 600)
list_notes = QListWidget()
list_notes_label = QLabel('Список заметок')
button_note_create = QPushButton('Создать заметку')
button_note_del = QPushButton('Удалить заметку')
button_note_save = QPushButton('Сохранить заметку')
field_tag = QLineEdit('')
field_tag.setPlaceholderText('Введите тег...')
field_text = QTextEdit()
button_tag_add = QPushButton('Добавит к заметке')
button_tag_del = QPushButton('Открепит от заметки')
button_tag_search = QPushButton('Искать заметки по тегу')
list_tags = QListWidget()
list_tags_label = QLabel('Список тегов')
#направляющие лайауты и прикрепление элементов интерфейса к ним
layout_notes = QHBoxLayout()
col_1= QVBoxLayout()
col_1.addWidget(field_text)
col_2 = QVBoxLayout()
col_2.addWidget(list_notes_label)
col_2.addWidget(list_notes)
row_1 = QHBoxLayout()
row_1.addWidget(button_note_create)
|
|
row_1.addWidget(button_note_del)
row_2 = QHBoxLayout()
row_2.addWidget(button_note_save)
col_2.addLayout(row_1)
col_2.addLayout(row_2)
col_2.addWidget(list_tags_label)
col_2.addWidget(list_tags)
col_2.addWidget(field_tag)
row_3 = QHBoxLayout()
row_3.addWidget(button_tag_add)
row_3.addWidget(button_tag_del)
row_4 = QHBoxLayout()
row_4.addWidget(button_tag_search)
col_2.addLayout(row_3)
col_2.addLayout(row_4)
#растяжение лайаутов относительно размеров окна
layout_notes.addLayout(col_1, stretch = 2)
layout_notes.addLayout(col_2, stretch = 1)
#прикрепление главного лайаута к окну приложения
my_win.setLayout(layout_notes)
#описание функций-обработчиков для реакций на события
# Функция-обработчик для события "Добавление заметки"
def add_note():
note_name, ok = QInputDialog.getText(my_win, 'Добавить заметку', 'Название заметки: ')
if ok and note_name != '':
notes[note_name] = {'текст' : '', 'теги' : []}
list_notes.addItem(note_name)
list_tags.addItems(notes[note_name]['теги'])
print(notes)
# Функция-обработчик для события "Показать заметку и ее содержимое"
def show_note():
key = list_notes.selectedItems()[0].text()
print(key)
field_text.setText(notes[key]['текст'])
list_tags.clear()
list_tags.addItems(notes[key]['теги'])
# Функция обработчик для события "Созранить заметку и ее содержимое"
def save_note():
if list_notes.selectedItems():
key = list_notes.selectedItems()[0].text()
notes[key]['текст'] = field_text.toPlainText()
with open('notes_data.json', 'w') as file:
json.dump(notes, file, sort_keys=True, ensure_ascii=False)
|
|
print(notes)
else:
print('Заметки для сохранения не выбраны!')
# Функция-обработчик для события "Удалить заметку и ее сожержимое"
def del_note():
if list_notes.selectedItems():
key = list_notes.selectedItems()[0].text()
del notes[key]
list_notes.clear()
list_tags.clear()
field_text.clear()
list_notes.addItems(notes)
with open('notes_data.json', 'w') as file:
json.dump(notes, file, sort_keys=True, ensure_ascii=False)
print(notes)
else:
print('Заметки для удаления не выбранны!')
# Функция-обработчик для события "Добавление тега к заметке"
def add_tag():
if list_notes.selectedItems():
key = list_notes.selectedItems()[0].text()
tag = field_tag.text()
if not tag in notes[key]['теги']:
notes[key]['теги'].append(tag)
list_tags.addItem(tag)
field_tag.clear()
with open('notes_data.json', 'w') as file:
json.dump(notes, file, sort_keys=True, ensure_ascii=False)
print(notes)
else:
print('Заметка для добавления тега не выбранна!')
# Функция-обработчик для события "Удалить тег заметки"
def del_tag():
if list_tags.selectedItems():
key = list_notes.selectedItems()[0].text()
tag = list_tags.selectedItems()[0].text()
notes[key]['теги'].remove(tag)
list_tags.clear()
list_tags.addItems(notes[key]['теги'])
with open('notes_data.json', 'w') as file:
json.dump(notes, file, sort_keys=True, ensure_ascii=False)
else:
print('Теги для удаления не выбранны')
# Функция-обработчик для события "Поиск заметки по тегу"
def search_tag():
print(button_tag_search.text())
tag = field_tag.text()
|
|
if button_tag_search.text() == 'Искать заметки по тегу' and tag:
print(tag)
notes_filtered = {}
for note in notes:
if tag in notes[note]['теги']:
notes_filtered[note]=notes[note]
button_tag_search.setText('Сбросить поиск')
list_notes.clear()
list_tags.clear()
list_notes.addItems(notes_filtered)
print(button_tag_search.text())
elif button_tag_search.text() == 'Сбросить поиск':
field_tag.clear()
list_notes.clear()
list_tags.clear()
list_notes.addItems(notes)
button_tag_search.setText('Искать заметки по тегу')
print(button_tag_search.text())
else:
pass
# Подвязка функция-обработчиков к событиям серез команду-подписку на событие "clicked.connect()"
button_note_create.clicked.connect(add_note)
list_notes.itemClicked.connect(show_note)
button_note_save.clicked.connect(save_note)
button_note_del.clicked.connect(del_note)
button_tag_add.clicked.connect(add_tag)
button_tag_del.clicked.connect(del_tag)
button_tag_search.clicked.connect(search_tag)
list_notes.itemClicked.connect(show_note)
# Отображение окна приложения на экран
my_win.show()
# Открытие json-файла для записи
with open("notes_data.json", "r") as file:
notes = json.load(file)
# Добавление заметки в список заметок
list_notes.addItems(notes)
# С помощью метода "exec_()" приложение остается открытым, пока его не закроет пользователь
app.exec_()
Дата добавления: 2021-07-19; просмотров: 111; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!