Compare commits

..

8 commits
Python ... main

Author SHA1 Message Date
5523bf2e65
README.md 2025-06-30 12:40:51 +03:00
d66c8fcd08
README.md 2025-06-30 02:06:20 +03:00
07a5f23c11
README.md 2025-06-30 02:05:07 +03:00
Egor Deev
a3f3852491
v. 3.0 2021-12-25 22:09:47 +07:00
Egor Deev
0fc113e0f3
Source QTD 2021-12-25 22:07:39 +07:00
Egor Deev
a60e657a59
Source QTD 2021-12-25 22:06:00 +07:00
Egor Deev
c80aff7ed5
v. 3.1.1 2021-12-25 22:05:38 +07:00
Egor Deev
c1120de07e
v. 3.1 2021-12-23 14:49:29 +07:00
2 changed files with 184 additions and 24 deletions

154
README.md
View file

@ -1,2 +1,152 @@
<h1>Таблица со Школьным Расписанием</h1> # School Table
<h3>Приложение для ведения школьного расписания, и записи заметок! Сейчас там установлен шаблон с расписанием автора, но вы можете его очистить и ввести <i>своё</i> расписание с нуля!</h3>
[![Python](https://img.shields.io/badge/Python-3.7+-blue.svg)](https://www.python.org/downloads/)
[![PyQt5](https://img.shields.io/badge/PyQt5-5.15+-green.svg)](https://pypi.org/project/PyQt5/)
[![SQLite](https://img.shields.io/badge/SQLite-3+-orange.svg)](https://sqlite.org/)
[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](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>

54
main.py
View file

@ -12,10 +12,6 @@ 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):
@ -918,17 +914,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))
self.Toolbar1.setTabText(self.Toolbar1.indexOf(self.Add), _translate("MainWindow", "Добавить")) Tabs = {self.Toolbar1: [[self.Add, "Добавить"], [self.Del, "Удалить"]],
self.Toolbar1.setTabText(self.Toolbar1.indexOf(self.Del), _translate("MainWindow", "Удалить")) self.Toolbar2: [[self.Upd, "Изменить"], [self.Clear, "Убрать"]],
self.Toolbar2.setTabText(self.Toolbar2.indexOf(self.Upd), _translate("MainWindow", "Изменить")) self.tabWidget: [[self.rasp, "Расписание"], [self.note, "Заметки"]],
self.Toolbar2.setTabText(self.Toolbar2.indexOf(self.Clear), _translate("MainWindow", "Убрать")) self.tabWidget_2: [[self.Show, "Показать"], [self.Doing, "Сделать"],
self.tabWidget.setTabText(self.tabWidget.indexOf(self.rasp), _translate("MainWindow", "Расписание")) [self.Adding, "Добавить"], [self.Upating, "Редактрировать"]]}
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.Show), _translate("MainWindow", "Показать"))
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.Doing), _translate("MainWindow", "Сделать"))
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.Adding), _translate("MainWindow", "Добавить"))
self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.Upating), _translate("MainWindow", "Редактрировать"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.note), _translate("MainWindow", "Заметки"))
for i in Tabs:
for j in Tabs[i]:
i.setTabText(i.indexOf(j[0]), _translate("MainWindow", j[1]))
# ОСНОВНОЕ ТЕЛО ПРОГРАММЫ # ОСНОВНОЕ ТЕЛО ПРОГРАММЫ
class MyWidget(QMainWindow, Ui_MainWindow): class MyWidget(QMainWindow, Ui_MainWindow):
@ -1211,17 +1206,22 @@ 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 = ['.'.join(reversed(str(dt.date.today() + dt.timedelta(days=i)).split('-'))) for i in range(30)] dates = [dt.date.today() + dt.timedelta(days=i) for i in range(30)]
else: else:
dates = ['.'.join(reversed(str(dt.date.today() + dt.timedelta(days=i)).split('-'))) for i in range(7)] dates = [dt.date.today() + dt.timedelta(days=i) for i in range(7)]
notes = [i for i in note if i[0][-10:] in dates] notes = [[dt.datetime.strftime(dat, "%d.%m.%Y %H:%M "), nt] for dat, nt in note if dat.date() in dates]
if notes: if notes:
for i, row in enumerate(notes): for i, row in enumerate(notes):
@ -1238,8 +1238,13 @@ 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` FROM `notes`").fetchall() notes = self.cursor.execute("SELECT `id`, `date` 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, ))
@ -1273,8 +1278,13 @@ 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` FROM `notes`").fetchall() notes = self.cursor.execute("SELECT `id`, `date` 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:
@ -1311,4 +1321,4 @@ if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
ex = MyWidget() ex = MyWidget()
ex.show() ex.show()
sys.exit(app.exec_()) sys.exit(app.exec_())