mirror of
https://github.com/EDeev/school_table.git
synced 2026-10-08 04:59:36 +03:00
Compare commits
No commits in common. "4631ea9fa18376e8c2e613a91b48e4675cfffee8" and "5523bf2e657905315c9b43329ddbabd5860db712" have entirely different histories.
4631ea9fa1
...
5523bf2e65
9 changed files with 162 additions and 199 deletions
32
.github/workflows/ci.yml
vendored
32
.github/workflows/ci.yml
vendored
|
|
@ -1,32 +0,0 @@
|
||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [main]
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.12"
|
|
||||||
- run: sudo apt-get update -qq && sudo apt-get install -y -qq libegl1 libxkbcommon0 libdbus-1-3
|
|
||||||
- run: pip install ruff==0.14.0 -r requirements.txt
|
|
||||||
- name: Ruff (синтаксис и ошибки)
|
|
||||||
run: ruff check --select E9,F main.py
|
|
||||||
- name: Окно открывается и читает базу
|
|
||||||
env:
|
|
||||||
QT_QPA_PLATFORM: offscreen
|
|
||||||
run: |
|
|
||||||
python -c "
|
|
||||||
import sys
|
|
||||||
from PyQt5.QtWidgets import QApplication, QMessageBox
|
|
||||||
QMessageBox.about = staticmethod(lambda *a: sys.exit('ошибка: ' + a[2]))
|
|
||||||
import main
|
|
||||||
app = QApplication(sys.argv)
|
|
||||||
w = main.MyWidget()
|
|
||||||
assert w.Mon_school.rowCount() == 8
|
|
||||||
print('ok')"
|
|
||||||
25
.github/workflows/release.yml
vendored
25
.github/workflows/release.yml
vendored
|
|
@ -1,25 +0,0 @@
|
||||||
name: Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags: ["v*"]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
exe:
|
|
||||||
runs-on: windows-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.12"
|
|
||||||
- run: pip install pyinstaller -r requirements.txt
|
|
||||||
- name: Сборка .exe
|
|
||||||
run: pyinstaller --onefile --windowed --icon image.ico --name SchoolTable main.py
|
|
||||||
- name: Архив с программой, пустой базой и иконкой
|
|
||||||
run: Compress-Archive -Path dist/SchoolTable.exe, table.db, image.ico -DestinationPath SchoolTable-windows.zip
|
|
||||||
- name: Файл в релиз
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
run: gh release upload "${{ github.ref_name }}" SchoolTable-windows.zip --clobber
|
|
||||||
58
README.en.md
58
README.en.md
|
|
@ -1,58 +0,0 @@
|
||||||
# School Table
|
|
||||||
|
|
||||||
[Русский](README.md) · **English**
|
|
||||||
|
|
||||||
[](https://github.com/EDeev/school_table/actions/workflows/ci.yml)
|
|
||||||
[](https://github.com/EDeev/school_table/releases)
|
|
||||||
|
|
||||||
A desktop student planner on PyQt5: a weekly timetable and dated notes that show up under the right day
|
|
||||||
on their own. The interface is in Russian.
|
|
||||||
|
|
||||||
**Status:** coursework (2021), completed
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**Stack:** Python 3 · PyQt5 · SQLite
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- A grid of six school days, up to eight lessons a day
|
|
||||||
- Subject list: add, rename, delete (the subject also disappears from the timetable), clear a lesson
|
|
||||||
- Highlighting a chosen subject across the whole week
|
|
||||||
- Notes with date and time: shown under the timetable by weekday, and on the Notes tab as one list for
|
|
||||||
all time, the coming month or the coming week
|
|
||||||
- Editing a note and marking it done (a done note is deleted)
|
|
||||||
- Everything is stored locally in `table.db`
|
|
||||||
|
|
||||||
## Running
|
|
||||||
|
|
||||||
A ready-made Windows build is `SchoolTable-windows.zip` in the
|
|
||||||
[releases](https://github.com/EDeev/school_table/releases): unpack it and run `SchoolTable.exe` (keep
|
|
||||||
`table.db` next to it).
|
|
||||||
|
|
||||||
From source:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/EDeev/school_table.git && cd school_table
|
|
||||||
pip install -r requirements.txt
|
|
||||||
python main.py
|
|
||||||
```
|
|
||||||
|
|
||||||
## Screenshots
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Coursework (2021). The code is open for study; there is no separate license.
|
|
||||||
|
|
||||||
## Author
|
|
||||||
|
|
||||||
**Egor Deev** — [GitHub](https://github.com/EDeev) · [Telegram](https://t.me/DeevEgor) · [egor@deev.space](mailto:egor@deev.space)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
<sub>⭐ If you find this project useful, give it a star on GitHub!</sub>
|
|
||||||
<p><sub>Made with ❤️ — <a href="https://deev.space">deev.space</a></sub></p>
|
|
||||||
</div>
|
|
||||||
162
README.md
162
README.md
|
|
@ -1,66 +1,152 @@
|
||||||
# School Table
|
# School Table
|
||||||
|
|
||||||
**Русский** · [English](README.en.md)
|
[](https://www.python.org/downloads/)
|
||||||
|
[](https://pypi.org/project/PyQt5/)
|
||||||
|
[](https://sqlite.org/)
|
||||||
|
[](LICENSE)
|
||||||
|
|
||||||
[](https://github.com/EDeev/school_table/actions/workflows/ci.yml)
|
**Многофункциональное desktop-приложение для управления школьным расписанием и ведения персональных заметок.**
|
||||||
[](https://github.com/EDeev/school_table/releases)
|
|
||||||
|
|
||||||
Десктопный дневник школьника на PyQt5: расписание на неделю и заметки с датами, которые сами
|
## 📋 Описание
|
||||||
появляются под нужным днём.
|
|
||||||
|
|
||||||
**Статус:** учебный проект (2021), завершён
|
School Table представляет собой комплексное решение для организации учебного процесса, объединяющее систему управления расписанием с функциональностью персонального планировщика. Приложение обеспечивает интуитивно понятный интерфейс для создания, редактирования и контроля академических задач.
|
||||||
|
|
||||||

|
## ✨ Основные возможности
|
||||||
|
|
||||||
**Стек:** Python 3 · PyQt5 · SQLite
|
### 📅 Управление расписанием
|
||||||
|
- **Интерактивная сетка расписания** — визуализация учебной недели с возможностью быстрого редактирования
|
||||||
|
- **Динамическое управление предметами** — добавление, изменение и удаление дисциплин
|
||||||
|
- **Система выделения** — цветовая индикация для быстрой навигации по предметам
|
||||||
|
- **Гибкая настройка** — поддержка до 8 учебных периодов в день
|
||||||
|
|
||||||
## Возможности
|
### 📝 Система заметок
|
||||||
|
- **Временные метки** — привязка заметок к конкретным датам и времени
|
||||||
|
- **Фильтрация по периодам** — просмотр задач за день, неделю, месяц
|
||||||
|
- **Статусы выполнения** — отслеживание прогресса выполнения задач
|
||||||
|
- **Редактирование в реальном времени** — мгновенное обновление данных
|
||||||
|
|
||||||
- Сетка на шесть учебных дней, до восьми уроков в день
|
### 🔧 Дополнительный функционал
|
||||||
- Список предметов: добавить, переименовать, удалить (предмет пропадает и из расписания), очистить урок
|
- **Кроссплатформенность** — работа на Windows, macOS, Linux
|
||||||
- Подсветка выбранного предмета во всей неделе
|
- **Локальное хранение данных** — автономная работа без интернета
|
||||||
- Заметки с датой и временем: под расписанием показываются по дню недели, на вкладке «Заметки» —
|
- **Резервное копирование** — защита данных пользователя
|
||||||
общим списком за всё время, ближайший месяц или неделю
|
|
||||||
- Правка заметки и отметка «сделано» (выполненная заметка удаляется)
|
|
||||||
- Всё хранится локально в `table.db`
|
|
||||||
|
|
||||||
## Запуск
|
## 🛠 Технический стек
|
||||||
|
|
||||||
Готовая сборка для Windows — `SchoolTable-windows.zip` в [релизах](https://github.com/EDeev/school_table/releases):
|
| Компонент | Технология | Версия |
|
||||||
распакуйте и запустите `SchoolTable.exe` (база `table.db` должна лежать рядом).
|
|-----------|------------|---------|
|
||||||
|
| **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
|
```bash
|
||||||
git clone https://github.com/EDeev/school_table.git && cd school_table
|
|
||||||
pip install -r requirements.txt
|
|
||||||
python main.py
|
python main.py
|
||||||
```
|
```
|
||||||
|
|
||||||
## Как выглядит
|
### Альтернативный способ установки
|
||||||
|
```bash
|
||||||
|
# Создание виртуального окружения
|
||||||
|
python -m venv venv
|
||||||
|
source venv/bin/activate # Linux/macOS
|
||||||
|
# или
|
||||||
|
venv\Scripts\activate # Windows
|
||||||
|
|
||||||

|
# Установка зависимостей
|
||||||
|
pip install PyQt5 sqlite3
|
||||||
## Структура
|
|
||||||
|
|
||||||
```
|
|
||||||
main.py приложение: интерфейс (сгенерирован из rasp.ui) и вся логика
|
|
||||||
rasp.ui макет окна для Qt Designer
|
|
||||||
table.db пустая база: предметы, расписание по дням, заметки
|
|
||||||
image.ico иконка
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Лицензия
|
## 🎯 Использование
|
||||||
|
|
||||||
Учебный проект (2021). Код открыт для изучения, отдельной лицензии нет.
|
### Быстрый старт
|
||||||
|
|
||||||
## Автор
|
1. **Настройка расписания**
|
||||||
|
- Перейдите на вкладку "Расписание"
|
||||||
|
- Выберите день недели и номер урока
|
||||||
|
- Добавьте новый предмет или выберите существующий
|
||||||
|
|
||||||
**Деев Егор Викторович** — [GitHub](https://github.com/EDeev) · [Telegram](https://t.me/DeevEgor) · [egor@deev.space](mailto:egor@deev.space)
|
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">
|
<div align="center">
|
||||||
<sub>⭐ Если проект оказался полезным, поставьте звёздочку на GitHub!</sub>
|
<sub>Создано с ❤️ от вашего дорогого - deev.space ©</sub>
|
||||||
<p><sub>Сделано с ❤️ — <a href="https://deev.space">deev.space</a></sub></p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 50 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 107 KiB |
55
main.py
55
main.py
|
|
@ -1,6 +1,5 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import datetime as dt
|
import datetime as dt
|
||||||
import os
|
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
@ -238,7 +237,7 @@ class Ui_MainWindow(object):
|
||||||
self.check_but1.setFont(font)
|
self.check_but1.setFont(font)
|
||||||
self.check_but1.setStyleSheet("QPushButton {\n"
|
self.check_but1.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -263,7 +262,7 @@ class Ui_MainWindow(object):
|
||||||
self.check_but2.setFont(font)
|
self.check_but2.setFont(font)
|
||||||
self.check_but2.setStyleSheet("QPushButton {\n"
|
self.check_but2.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -288,7 +287,7 @@ class Ui_MainWindow(object):
|
||||||
self.check_but3.setFont(font)
|
self.check_but3.setFont(font)
|
||||||
self.check_but3.setStyleSheet("QPushButton {\n"
|
self.check_but3.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -408,7 +407,7 @@ class Ui_MainWindow(object):
|
||||||
self.add_but.setFont(font)
|
self.add_but.setFont(font)
|
||||||
self.add_but.setStyleSheet("QPushButton {\n"
|
self.add_but.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -451,7 +450,7 @@ class Ui_MainWindow(object):
|
||||||
self.del_but.setFont(font)
|
self.del_but.setFont(font)
|
||||||
self.del_but.setStyleSheet("QPushButton {\n"
|
self.del_but.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -503,7 +502,7 @@ class Ui_MainWindow(object):
|
||||||
self.upd_but.setFont(font)
|
self.upd_but.setFont(font)
|
||||||
self.upd_but.setStyleSheet("QPushButton {\n"
|
self.upd_but.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -554,7 +553,7 @@ class Ui_MainWindow(object):
|
||||||
self.clear_but.setFont(font)
|
self.clear_but.setFont(font)
|
||||||
self.clear_but.setStyleSheet("QPushButton {\n"
|
self.clear_but.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -615,7 +614,7 @@ class Ui_MainWindow(object):
|
||||||
self.showing.setFont(font)
|
self.showing.setFont(font)
|
||||||
self.showing.setStyleSheet("QPushButton {\n"
|
self.showing.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -678,7 +677,7 @@ class Ui_MainWindow(object):
|
||||||
self.complete.setFont(font)
|
self.complete.setFont(font)
|
||||||
self.complete.setStyleSheet("QPushButton {\n"
|
self.complete.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -736,7 +735,7 @@ class Ui_MainWindow(object):
|
||||||
self.added.setFont(font)
|
self.added.setFont(font)
|
||||||
self.added.setStyleSheet("QPushButton {\n"
|
self.added.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -792,7 +791,7 @@ class Ui_MainWindow(object):
|
||||||
self.demonstr.setFont(font)
|
self.demonstr.setFont(font)
|
||||||
self.demonstr.setStyleSheet("QPushButton {\n"
|
self.demonstr.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -856,7 +855,7 @@ class Ui_MainWindow(object):
|
||||||
self.updat.setFont(font)
|
self.updat.setFont(font)
|
||||||
self.updat.setStyleSheet("QPushButton {\n"
|
self.updat.setStyleSheet("QPushButton {\n"
|
||||||
" padding:10px;\n"
|
" padding:10px;\n"
|
||||||
" color: #ffffff;\n"
|
" color: #fffff;\n"
|
||||||
" font-size: 18px;\n"
|
" font-size: 18px;\n"
|
||||||
" border-radius: 10px;\n"
|
" border-radius: 10px;\n"
|
||||||
" border: 1px solid #3873d9;\n"
|
" border: 1px solid #3873d9;\n"
|
||||||
|
|
@ -919,7 +918,7 @@ class Ui_MainWindow(object):
|
||||||
self.Toolbar2: [[self.Upd, "Изменить"], [self.Clear, "Убрать"]],
|
self.Toolbar2: [[self.Upd, "Изменить"], [self.Clear, "Убрать"]],
|
||||||
self.tabWidget: [[self.rasp, "Расписание"], [self.note, "Заметки"]],
|
self.tabWidget: [[self.rasp, "Расписание"], [self.note, "Заметки"]],
|
||||||
self.tabWidget_2: [[self.Show, "Показать"], [self.Doing, "Сделать"],
|
self.tabWidget_2: [[self.Show, "Показать"], [self.Doing, "Сделать"],
|
||||||
[self.Adding, "Добавить"], [self.Upating, "Редактировать"]]}
|
[self.Adding, "Добавить"], [self.Upating, "Редактрировать"]]}
|
||||||
|
|
||||||
for i in Tabs:
|
for i in Tabs:
|
||||||
for j in Tabs[i]:
|
for j in Tabs[i]:
|
||||||
|
|
@ -969,8 +968,8 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
for i in range(10):
|
for i in range(10):
|
||||||
if i > 1:
|
if i > 1:
|
||||||
if weekday[i]:
|
if weekday[i]:
|
||||||
obj = self.cursor.execute("SELECT name FROM lessons WHERE `id` = ?",
|
obj = self.cursor.execute(f"SELECT name FROM "
|
||||||
(weekday[i],)).fetchone()[0]
|
f"lessons WHERE `id` = {weekday[i]}").fetchone()[0]
|
||||||
else:
|
else:
|
||||||
obj = ""
|
obj = ""
|
||||||
subjects.append((obj, ))
|
subjects.append((obj, ))
|
||||||
|
|
@ -1099,7 +1098,7 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
if txt1:
|
if txt1:
|
||||||
if txt1 not in lessons:
|
if txt1 not in lessons:
|
||||||
with self.connection:
|
with self.connection:
|
||||||
self.cursor.execute("INSERT INTO `lessons` (`name`) VALUES(?)", (txt1,))
|
self.cursor.execute(f"INSERT INTO `lessons` (`name`) VALUES(?)", (txt1,))
|
||||||
lessons = self.cursor.execute('SELECT `name` FROM `lessons`').fetchall()
|
lessons = self.cursor.execute('SELECT `name` FROM `lessons`').fetchall()
|
||||||
lessons = [i[0] for i in lessons]
|
lessons = [i[0] for i in lessons]
|
||||||
with self.connection:
|
with self.connection:
|
||||||
|
|
@ -1142,7 +1141,7 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
txt = self.upd_line.text()
|
txt = self.upd_line.text()
|
||||||
if txt != "":
|
if txt != "":
|
||||||
with self.connection:
|
with self.connection:
|
||||||
self.cursor.execute("UPDATE `lessons` SET `name` = ? WHERE `name` = ?", (txt, obj))
|
self.cursor.execute(f"UPDATE `lessons` SET `name` = ? WHERE `name` = ?", (txt, obj))
|
||||||
self.upd_line.clear()
|
self.upd_line.clear()
|
||||||
self.table_rasp()
|
self.table_rasp()
|
||||||
else:
|
else:
|
||||||
|
|
@ -1162,8 +1161,6 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
|
|
||||||
def delete(self):
|
def delete(self):
|
||||||
index = self.choose_obj3.currentText()
|
index = self.choose_obj3.currentText()
|
||||||
if not index: # список предметов пуст
|
|
||||||
return
|
|
||||||
with self.connection:
|
with self.connection:
|
||||||
ids = self.cursor.execute("SELECT `id` FROM `lessons` WHERE `name` = ?", (index, )).fetchone()[0]
|
ids = self.cursor.execute("SELECT `id` FROM `lessons` WHERE `name` = ?", (index, )).fetchone()[0]
|
||||||
self.cursor.execute("DELETE FROM `lessons` WHERE `id` = ?", (ids, ))
|
self.cursor.execute("DELETE FROM `lessons` WHERE `id` = ?", (ids, ))
|
||||||
|
|
@ -1181,8 +1178,6 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
index, sender = self.choose_obj4.currentText(), self.sender().text()
|
index, sender = self.choose_obj4.currentText(), self.sender().text()
|
||||||
if not index:
|
|
||||||
return
|
|
||||||
with self.connection:
|
with self.connection:
|
||||||
ids = self.cursor.execute("SELECT `id` FROM `lessons` WHERE `name` = ?", (index,)).fetchone()[0]
|
ids = self.cursor.execute("SELECT `id` FROM `lessons` WHERE `name` = ?", (index,)).fetchone()[0]
|
||||||
|
|
||||||
|
|
@ -1261,10 +1256,13 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
def add_note(self):
|
def add_note(self):
|
||||||
date = self.date_1.dateTime().toString("HH:mm dd.MM.yyyy")
|
date = self.date_1.dateTime().toString("HH:mm dd.MM.yyyy")
|
||||||
txt = self.write.toPlainText()
|
txt = self.write.toPlainText()
|
||||||
# день недели числом (0 — понедельник), не из текста даты: тот зависит от языка системы
|
day = self.date_1.dateTime().toString()[:2]
|
||||||
day = self.date_1.date().dayOfWeek() - 1
|
|
||||||
|
|
||||||
if txt:
|
if txt:
|
||||||
|
for i, elem in enumerate(["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]):
|
||||||
|
if day == elem:
|
||||||
|
day = i
|
||||||
|
break
|
||||||
with self.connection:
|
with self.connection:
|
||||||
self.cursor.execute("INSERT INTO `notes` (`date`, `day`, `note`) VALUES(?,?,?)", (date, day, txt))
|
self.cursor.execute("INSERT INTO `notes` (`date`, `day`, `note`) VALUES(?,?,?)", (date, day, txt))
|
||||||
self.table_rasp()
|
self.table_rasp()
|
||||||
|
|
@ -1290,7 +1288,7 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
|
|
||||||
if sender == "Показать":
|
if sender == "Показать":
|
||||||
with self.connection:
|
with self.connection:
|
||||||
note = self.cursor.execute("SELECT `date`, `note` FROM notes WHERE `id` = ?", (ids,)).fetchone()
|
note = self.cursor.execute(f"SELECT `date`, `note` FROM notes WHERE `id` = {ids}").fetchone()
|
||||||
|
|
||||||
# ОТОБРАЖЕНИЕ ДАТЫ ИЗ БАЗЫ
|
# ОТОБРАЖЕНИЕ ДАТЫ ИЗ БАЗЫ
|
||||||
datetime = note[0].split()
|
datetime = note[0].split()
|
||||||
|
|
@ -1303,12 +1301,9 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
elif sender == "Обновить":
|
elif sender == "Обновить":
|
||||||
date = self.date_2.dateTime().toString("HH:mm dd.MM.yyyy")
|
date = self.date_2.dateTime().toString("HH:mm dd.MM.yyyy")
|
||||||
txt = self.write_2.toPlainText()
|
txt = self.write_2.toPlainText()
|
||||||
# при переносе заметки на другую дату меняется и день недели под расписанием
|
|
||||||
day = self.date_2.date().dayOfWeek() - 1
|
|
||||||
|
|
||||||
with self.connection:
|
with self.connection:
|
||||||
self.cursor.execute("UPDATE `notes` SET `date` = ?, `day` = ?, `note` = ? WHERE `id` = ?",
|
self.cursor.execute(f"UPDATE `notes` SET `date` = ?, `note` = ? WHERE `id` = ?", (date, txt, ids))
|
||||||
(date, day, txt, ids))
|
|
||||||
|
|
||||||
self.write_2.clear()
|
self.write_2.clear()
|
||||||
self.table_rasp()
|
self.table_rasp()
|
||||||
|
|
@ -1323,8 +1318,6 @@ class MyWidget(QMainWindow, Ui_MainWindow):
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# table.db ищется рядом с программой (или с .exe), а не в текущей папке терминала
|
|
||||||
os.chdir(os.path.dirname(sys.executable if getattr(sys, "frozen", False) else os.path.abspath(__file__)))
|
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
ex = MyWidget()
|
ex = MyWidget()
|
||||||
ex.show()
|
ex.show()
|
||||||
|
|
|
||||||
26
rasp.ui
26
rasp.ui
|
|
@ -456,7 +456,7 @@
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -494,7 +494,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -532,7 +532,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -836,7 +836,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -902,7 +902,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -996,7 +996,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -1151,7 +1151,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -1263,7 +1263,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -1386,7 +1386,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -1486,7 +1486,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -1545,7 +1545,7 @@ QPushButton:hover{
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="Upating">
|
<widget class="QWidget" name="Upating">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Редактировать</string>
|
<string>Редактрировать</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
<item>
|
<item>
|
||||||
|
|
@ -1585,7 +1585,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
@ -1703,7 +1703,7 @@ QPushButton:hover{
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QPushButton {
|
<string notr="true">QPushButton {
|
||||||
padding:10px;
|
padding:10px;
|
||||||
color: #ffffff;
|
color: #fffff;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #3873d9;
|
border: 1px solid #3873d9;
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
PyQt5==5.15.11
|
|
||||||
Loading…
Add table
Reference in a new issue