mirror of
https://github.com/EDeev/school_table.git
synced 2026-06-15 19:11:13 +03:00
Compare commits
No commits in common. "main" and "Python" have entirely different histories.
2 changed files with 24 additions and 184 deletions
154
README.md
154
README.md
|
|
@ -1,152 +1,2 @@
|
||||||
# School Table
|
<h1>Таблица со Школьным Расписанием</h1>
|
||||||
|
<h3>Приложение для ведения школьного расписания, и записи заметок! Сейчас там установлен шаблон с расписанием автора, но вы можете его очистить и ввести <i>своё</i> расписание с нуля!</h3>
|
||||||
[](https://www.python.org/downloads/)
|
|
||||||
[](https://pypi.org/project/PyQt5/)
|
|
||||||
[](https://sqlite.org/)
|
|
||||||
[](LICENSE)
|
|
||||||
|
|
||||||
**Многофункциональное desktop-приложение для управления школьным расписанием и ведения персональных заметок.**
|
|
||||||
|
|
||||||
## 📋 Описание
|
|
||||||
|
|
||||||
School Table представляет собой комплексное решение для организации учебного процесса, объединяющее систему управления расписанием с функциональностью персонального планировщика. Приложение обеспечивает интуитивно понятный интерфейс для создания, редактирования и контроля академических задач.
|
|
||||||
|
|
||||||
## ✨ Основные возможности
|
|
||||||
|
|
||||||
### 📅 Управление расписанием
|
|
||||||
- **Интерактивная сетка расписания** — визуализация учебной недели с возможностью быстрого редактирования
|
|
||||||
- **Динамическое управление предметами** — добавление, изменение и удаление дисциплин
|
|
||||||
- **Система выделения** — цветовая индикация для быстрой навигации по предметам
|
|
||||||
- **Гибкая настройка** — поддержка до 8 учебных периодов в день
|
|
||||||
|
|
||||||
### 📝 Система заметок
|
|
||||||
- **Временные метки** — привязка заметок к конкретным датам и времени
|
|
||||||
- **Фильтрация по периодам** — просмотр задач за день, неделю, месяц
|
|
||||||
- **Статусы выполнения** — отслеживание прогресса выполнения задач
|
|
||||||
- **Редактирование в реальном времени** — мгновенное обновление данных
|
|
||||||
|
|
||||||
### 🔧 Дополнительный функционал
|
|
||||||
- **Кроссплатформенность** — работа на Windows, macOS, Linux
|
|
||||||
- **Локальное хранение данных** — автономная работа без интернета
|
|
||||||
- **Резервное копирование** — защита данных пользователя
|
|
||||||
|
|
||||||
## 🛠 Технический стек
|
|
||||||
|
|
||||||
| Компонент | Технология | Версия |
|
|
||||||
|-----------|------------|---------|
|
|
||||||
| **Backend** | Python | 3.7+ |
|
|
||||||
| **GUI Framework** | PyQt5 | 5.15+ |
|
|
||||||
| **Database** | SQLite | 3+ |
|
|
||||||
| **Architecture** | MVC Pattern | - |
|
|
||||||
|
|
||||||
## 📦 Установка и запуск
|
|
||||||
|
|
||||||
### Системные требования
|
|
||||||
- Python 3.7 или выше
|
|
||||||
- Операционная система: Windows 7+, macOS 10.12+, Linux
|
|
||||||
|
|
||||||
### Инструкция по установке
|
|
||||||
|
|
||||||
1. **Клонирование репозитория**
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/DeevEV/school_table.git
|
|
||||||
cd school_table
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Установка зависимостей**
|
|
||||||
```bash
|
|
||||||
pip install PyQt5 sqlite3
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Запуск приложения**
|
|
||||||
```bash
|
|
||||||
python main.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### Альтернативный способ установки
|
|
||||||
```bash
|
|
||||||
# Создание виртуального окружения
|
|
||||||
python -m venv venv
|
|
||||||
source venv/bin/activate # Linux/macOS
|
|
||||||
# или
|
|
||||||
venv\Scripts\activate # Windows
|
|
||||||
|
|
||||||
# Установка зависимостей
|
|
||||||
pip install PyQt5 sqlite3
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🎯 Использование
|
|
||||||
|
|
||||||
### Быстрый старт
|
|
||||||
|
|
||||||
1. **Настройка расписания**
|
|
||||||
- Перейдите на вкладку "Расписание"
|
|
||||||
- Выберите день недели и номер урока
|
|
||||||
- Добавьте новый предмет или выберите существующий
|
|
||||||
|
|
||||||
2. **Создание заметки**
|
|
||||||
- Откройте вкладку "Заметки" → "Добавить"
|
|
||||||
- Установите дату и время
|
|
||||||
- Введите текст заметки и сохраните
|
|
||||||
|
|
||||||
3. **Управление задачами**
|
|
||||||
- Используйте фильтры для просмотра заметок за определенный период
|
|
||||||
- Отмечайте выполненные задачи в разделе "Сделать"
|
|
||||||
|
|
||||||
## 📁 Структура проекта
|
|
||||||
|
|
||||||
```
|
|
||||||
school_table/
|
|
||||||
├── main.py # Точка входа в приложение
|
|
||||||
├── rasp.ui # Описание интерфейса Qt Designer
|
|
||||||
├── table.db # База данных SQLite (создается автоматически)
|
|
||||||
├── image.ico # Иконка приложения
|
|
||||||
└── README.md # Документация
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🗄 Схема базы данных
|
|
||||||
|
|
||||||
### Таблица `timetable`
|
|
||||||
```sql
|
|
||||||
CREATE TABLE timetable (
|
|
||||||
id INTEGER PRIMARY KEY,
|
|
||||||
day TEXT,
|
|
||||||
less_1 INTEGER, less_2 INTEGER, ..., less_8 INTEGER,
|
|
||||||
FOREIGN KEY (less_*) REFERENCES lessons(id)
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Таблица `lessons`
|
|
||||||
```sql
|
|
||||||
CREATE TABLE lessons (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
name TEXT UNIQUE NOT NULL
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Таблица `notes`
|
|
||||||
```sql
|
|
||||||
CREATE TABLE notes (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
date TEXT NOT NULL,
|
|
||||||
day INTEGER,
|
|
||||||
note TEXT NOT NULL
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📄 Лицензия
|
|
||||||
|
|
||||||
Этот проект распространяется под лицензией MIT.
|
|
||||||
|
|
||||||
## 👨💻 Автор
|
|
||||||
|
|
||||||
**Деев Егор Викторович**
|
|
||||||
- GitHub: [@EDeev](https://github.com/EDeev)
|
|
||||||
- Email: egor@deev.space
|
|
||||||
- Telegram: [@Egor_Deev](https://t.me/Egor_Deev)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<sub>Создано с ❤️ от вашего дорогого - deev.space ©</sub>
|
|
||||||
</div>
|
|
||||||
|
|
|
||||||
52
main.py
52
main.py
|
|
@ -12,6 +12,10 @@ if hasattr(QtCore.Qt, 'AA_EnableHighDpiScaling'):
|
||||||
if hasattr(QtCore.Qt, 'AA_UseHighDpiPixmaps'):
|
if hasattr(QtCore.Qt, 'AA_UseHighDpiPixmaps'):
|
||||||
QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)
|
QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)
|
||||||
|
|
||||||
|
# ВСТАВИТЬ В ИНТЕРФЕЙС ПОСЛЕ ФОРМАТИРОВАНИЯ
|
||||||
|
# self.setWindowTitle('Icon')
|
||||||
|
# self.setWindowIcon(QtGui.QIcon('web.png'))
|
||||||
|
|
||||||
|
|
||||||
class Ui_MainWindow(object):
|
class Ui_MainWindow(object):
|
||||||
def setupUi(self, MainWindow):
|
def setupUi(self, MainWindow):
|
||||||
|
|
@ -914,15 +918,16 @@ class Ui_MainWindow(object):
|
||||||
for x, tx in data:
|
for x, tx in data:
|
||||||
x.setText(_translate("MainWindow", tx))
|
x.setText(_translate("MainWindow", tx))
|
||||||
|
|
||||||
Tabs = {self.Toolbar1: [[self.Add, "Добавить"], [self.Del, "Удалить"]],
|
self.Toolbar1.setTabText(self.Toolbar1.indexOf(self.Add), _translate("MainWindow", "Добавить"))
|
||||||
self.Toolbar2: [[self.Upd, "Изменить"], [self.Clear, "Убрать"]],
|
self.Toolbar1.setTabText(self.Toolbar1.indexOf(self.Del), _translate("MainWindow", "Удалить"))
|
||||||
self.tabWidget: [[self.rasp, "Расписание"], [self.note, "Заметки"]],
|
self.Toolbar2.setTabText(self.Toolbar2.indexOf(self.Upd), _translate("MainWindow", "Изменить"))
|
||||||
self.tabWidget_2: [[self.Show, "Показать"], [self.Doing, "Сделать"],
|
self.Toolbar2.setTabText(self.Toolbar2.indexOf(self.Clear), _translate("MainWindow", "Убрать"))
|
||||||
[self.Adding, "Добавить"], [self.Upating, "Редактрировать"]]}
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.rasp), _translate("MainWindow", "Расписание"))
|
||||||
|
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.Show), _translate("MainWindow", "Показать"))
|
||||||
for i in Tabs:
|
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.Doing), _translate("MainWindow", "Сделать"))
|
||||||
for j in Tabs[i]:
|
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.Adding), _translate("MainWindow", "Добавить"))
|
||||||
i.setTabText(i.indexOf(j[0]), _translate("MainWindow", j[1]))
|
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.Upating), _translate("MainWindow", "Редактрировать"))
|
||||||
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.note), _translate("MainWindow", "Заметки"))
|
||||||
|
|
||||||
|
|
||||||
# ОСНОВНОЕ ТЕЛО ПРОГРАММЫ
|
# ОСНОВНОЕ ТЕЛО ПРОГРАММЫ
|
||||||
|
|
@ -1206,22 +1211,17 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
elif tp == 1 or tp == 2:
|
elif tp == 1 or tp == 2:
|
||||||
with self.connection:
|
with self.connection:
|
||||||
note = self.cursor.execute("SELECT `date`, `note` FROM notes").fetchall()
|
note = self.cursor.execute("SELECT `date`, `note` FROM notes").fetchall()
|
||||||
|
|
||||||
# СОРТИРОВКА ДАТ
|
|
||||||
note = [[dt.datetime.strptime(dat, "%H:%M %d.%m.%Y"), nt] for dat, nt in note]
|
|
||||||
note.sort()
|
|
||||||
|
|
||||||
maintable = self.maintable
|
maintable = self.maintable
|
||||||
maintable.setColumnCount(2)
|
maintable.setColumnCount(2)
|
||||||
maintable.setRowCount(0)
|
maintable.setRowCount(0)
|
||||||
maintable.setHorizontalHeaderLabels(["Дата", "Заметка"])
|
maintable.setHorizontalHeaderLabels(["Дата", "Заметка"])
|
||||||
|
|
||||||
if tp == 1:
|
if tp == 1:
|
||||||
dates = [dt.date.today() + dt.timedelta(days=i) for i in range(30)]
|
dates = ['.'.join(reversed(str(dt.date.today() + dt.timedelta(days=i)).split('-'))) for i in range(30)]
|
||||||
else:
|
else:
|
||||||
dates = [dt.date.today() + dt.timedelta(days=i) for i in range(7)]
|
dates = ['.'.join(reversed(str(dt.date.today() + dt.timedelta(days=i)).split('-'))) for i in range(7)]
|
||||||
|
|
||||||
notes = [[dt.datetime.strftime(dat, "%d.%m.%Y %H:%M "), nt] for dat, nt in note if dat.date() in dates]
|
notes = [i for i in note if i[0][-10:] in dates]
|
||||||
|
|
||||||
if notes:
|
if notes:
|
||||||
for i, row in enumerate(notes):
|
for i, row in enumerate(notes):
|
||||||
|
|
@ -1238,13 +1238,8 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
ids = note.split(".")[0]
|
ids = note.split(".")[0]
|
||||||
|
|
||||||
with self.connection:
|
with self.connection:
|
||||||
notes = self.cursor.execute("SELECT `id`, `date` FROM `notes`").fetchall()
|
notes = self.cursor.execute("SELECT `id` FROM `notes`").fetchall()
|
||||||
|
ids = notes[int(ids) - 1][0]
|
||||||
notes = [[dt.datetime.strptime(dat, "%H:%M %d.%m.%Y"), ids] for ids, dat in notes]
|
|
||||||
notes.sort()
|
|
||||||
notes = [idp for dat, idp in notes]
|
|
||||||
|
|
||||||
ids = notes[int(ids) - 1]
|
|
||||||
|
|
||||||
with self.connection:
|
with self.connection:
|
||||||
self.cursor.execute("DELETE FROM `notes` WHERE `id` = ?", (ids, ))
|
self.cursor.execute("DELETE FROM `notes` WHERE `id` = ?", (ids, ))
|
||||||
|
|
@ -1278,13 +1273,8 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
ids = z.split(".")[0]
|
ids = z.split(".")[0]
|
||||||
|
|
||||||
with self.connection:
|
with self.connection:
|
||||||
notes = self.cursor.execute("SELECT `id`, `date` FROM `notes`").fetchall()
|
notes = self.cursor.execute("SELECT `id` FROM `notes`").fetchall()
|
||||||
|
ids = notes[int(ids) - 1][0]
|
||||||
notes = [[dt.datetime.strptime(dat, "%H:%M %d.%m.%Y"), ids] for ids, dat in notes]
|
|
||||||
notes.sort()
|
|
||||||
notes = [idp for dat, idp in notes]
|
|
||||||
|
|
||||||
ids = notes[int(ids) - 1]
|
|
||||||
|
|
||||||
if sender == "Показать":
|
if sender == "Показать":
|
||||||
with self.connection:
|
with self.connection:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue