1
0
Fork 0
mirror of https://github.com/EDeev/school_table.git synced 2026-10-08 04:59:36 +03:00

Compare commits

...

3 commits

Author SHA1 Message Date
4631ea9fa1 README на русском и английском со скриншотами
Исправлены адрес клонирования (DeevEV → EDeev) и установка (sqlite3 — часть Python,
не пакет pip); возможности описаны по коду; бейдж MIT без файла лицензии заменён
учебной пометкой.
2026-10-05 18:42:17 +00:00
031082f4c0 requirements.txt, CI и сборка .exe в релиз
CI: ruff и запуск окна в offscreen-режиме с чтением базы. По тегу v* GitHub Actions
собирает SchoolTable.exe (PyInstaller) и кладёт в релиз архив с exe, пустой базой и иконкой.
2026-10-05 18:42:17 +00:00
396e2c66b6 Исправлены ошибки в заметках и расписании
- день недели заметки брался из текста даты, который зависит от языка системы: вне
  русской локали в базу писалось «Mo» вместо номера дня, и расписание переставало
  загружаться («Таблица данных не найдена»); теперь — QDate.dayOfWeek();
- при переносе заметки на другую дату день недели не менялся, и заметка оставалась под
  старым днём;
- «Удалить» и «Выделить» при пустом списке предметов роняли программу;
- table.db и иконка ищутся рядом с программой, а не в текущей папке терминала;
- SQL с подстановкой f-строкой заменён на параметры, лишние f-строки убраны;
- опечатки «Редактрировать», «Неудалось» и битый цвет #fffff в стилях.
2026-10-05 18:42:17 +00:00
9 changed files with 196 additions and 159 deletions

32
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,32 @@
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 Normal file
View file

@ -0,0 +1,25 @@
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 Normal file
View file

@ -0,0 +1,58 @@
# School Table
[Русский](README.md) · **English**
[![CI](https://github.com/EDeev/school_table/actions/workflows/ci.yml/badge.svg)](https://github.com/EDeev/school_table/actions/workflows/ci.yml)
[![Release](https://img.shields.io/github/v/release/EDeev/school_table)](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
![Timetable tab](docs/screenshots/timetable.png)
**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
![Notes tab](docs/screenshots/notes.png)
## 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>

156
README.md
View file

@ -1,152 +1,66 @@
# School Table
[![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)
**Русский** · [English](README.en.md)
**Многофункциональное desktop-приложение для управления школьным расписанием и ведения персональных заметок.**
[![CI](https://github.com/EDeev/school_table/actions/workflows/ci.yml/badge.svg)](https://github.com/EDeev/school_table/actions/workflows/ci.yml)
[![Release](https://img.shields.io/github/v/release/EDeev/school_table)](https://github.com/EDeev/school_table/releases)
## 📋 Описание
Десктопный дневник школьника на PyQt5: расписание на неделю и заметки с датами, которые сами
появляются под нужным днём.
School Table представляет собой комплексное решение для организации учебного процесса, объединяющее систему управления расписанием с функциональностью персонального планировщика. Приложение обеспечивает интуитивно понятный интерфейс для создания, редактирования и контроля академических задач.
**Статус:** учебный проект (2021), завершён
## ✨ Основные возможности
![Вкладка «Расписание»](docs/screenshots/timetable.png)
### 📅 Управление расписанием
- **Интерактивная сетка расписания** — визуализация учебной недели с возможностью быстрого редактирования
- **Динамическое управление предметами** — добавление, изменение и удаление дисциплин
- **Система выделения** — цветовая индикация для быстрой навигации по предметам
- **Гибкая настройка** — поддержка до 8 учебных периодов в день
**Стек:** Python 3 · PyQt5 · SQLite
### 📝 Система заметок
- **Временные метки** — привязка заметок к конкретным датам и времени
- **Фильтрация по периодам** — просмотр задач за день, неделю, месяц
- **Статусы выполнения** — отслеживание прогресса выполнения задач
- **Редактирование в реальном времени** — мгновенное обновление данных
## Возможности
### 🔧 Дополнительный функционал
- **Кроссплатформенность** — работа на Windows, macOS, Linux
- **Локальное хранение данных** — автономная работа без интернета
- **Резервное копирование** — защита данных пользователя
- Сетка на шесть учебных дней, до восьми уроков в день
- Список предметов: добавить, переименовать, удалить (предмет пропадает и из расписания), очистить урок
- Подсветка выбранного предмета во всей неделе
- Заметки с датой и временем: под расписанием показываются по дню недели, на вкладке «Заметки» —
общим списком за всё время, ближайший месяц или неделю
- Правка заметки и отметка «сделано» (выполненная заметка удаляется)
- Всё хранится локально в `table.db`
## 🛠 Технический стек
## Запуск
| Компонент | Технология | Версия |
|-----------|------------|---------|
| **Backend** | Python | 3.7+ |
| **GUI Framework** | PyQt5 | 5.15+ |
| **Database** | SQLite | 3+ |
| **Architecture** | MVC Pattern | - |
Готовая сборка для Windows — `SchoolTable-windows.zip` в [релизах](https://github.com/EDeev/school_table/releases):
распакуйте и запустите `SchoolTable.exe` (база `table.db` должна лежать рядом).
## 📦 Установка и запуск
Из исходников:
### Системные требования
- 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
git clone https://github.com/EDeev/school_table.git && cd school_table
pip install -r requirements.txt
python main.py
```
### Альтернативный способ установки
```bash
# Создание виртуального окружения
python -m venv venv
source venv/bin/activate # Linux/macOS
# или
venv\Scripts\activate # Windows
## Как выглядит
# Установка зависимостей
pip install PyQt5 sqlite3
```
![Вкладка «Заметки»](docs/screenshots/notes.png)
## 🎯 Использование
### Быстрый старт
1. **Настройка расписания**
- Перейдите на вкладку "Расписание"
- Выберите день недели и номер урока
- Добавьте новый предмет или выберите существующий
2. **Создание заметки**
- Откройте вкладку "Заметки" → "Добавить"
- Установите дату и время
- Введите текст заметки и сохраните
3. **Управление задачами**
- Используйте фильтры для просмотра заметок за определенный период
- Отмечайте выполненные задачи в разделе "Сделать"
## 📁 Структура проекта
## Структура
```
school_table/
├── main.py # Точка входа в приложение
├── rasp.ui # Описание интерфейса Qt Designer
├── table.db # База данных SQLite (создается автоматически)
├── image.ico # Иконка приложения
└── README.md # Документация
main.py приложение: интерфейс (сгенерирован из rasp.ui) и вся логика
rasp.ui макет окна для Qt Designer
table.db пустая база: предметы, расписание по дням, заметки
image.ico иконка
```
## 🗄 Схема базы данных
## Лицензия
### Таблица `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)
);
```
Учебный проект (2021). Код открыт для изучения, отдельной лицензии нет.
### Таблица `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)
**Деев Егор Викторович** — [GitHub](https://github.com/EDeev) · [Telegram](https://t.me/DeevEgor) · [egor@deev.space](mailto:egor@deev.space)
---
<div align="center">
<sub>Создано с ❤️ от вашего дорогого - deev.space ©</sub>
<sub>⭐ Если проект оказался полезным, поставьте звёздочку на GitHub!</sub>
<p><sub>Сделано с ❤️ — <a href="https://deev.space">deev.space</a></sub></p>
</div>

BIN
docs/screenshots/notes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

57
main.py
View file

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
import datetime as dt
import os
import sqlite3
import sys
@ -237,7 +238,7 @@ class Ui_MainWindow(object):
self.check_but1.setFont(font)
self.check_but1.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -262,7 +263,7 @@ class Ui_MainWindow(object):
self.check_but2.setFont(font)
self.check_but2.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -287,7 +288,7 @@ class Ui_MainWindow(object):
self.check_but3.setFont(font)
self.check_but3.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -407,7 +408,7 @@ class Ui_MainWindow(object):
self.add_but.setFont(font)
self.add_but.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -450,7 +451,7 @@ class Ui_MainWindow(object):
self.del_but.setFont(font)
self.del_but.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -502,7 +503,7 @@ class Ui_MainWindow(object):
self.upd_but.setFont(font)
self.upd_but.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -553,7 +554,7 @@ class Ui_MainWindow(object):
self.clear_but.setFont(font)
self.clear_but.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -614,7 +615,7 @@ class Ui_MainWindow(object):
self.showing.setFont(font)
self.showing.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -677,7 +678,7 @@ class Ui_MainWindow(object):
self.complete.setFont(font)
self.complete.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -735,7 +736,7 @@ class Ui_MainWindow(object):
self.added.setFont(font)
self.added.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -791,7 +792,7 @@ class Ui_MainWindow(object):
self.demonstr.setFont(font)
self.demonstr.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -855,7 +856,7 @@ class Ui_MainWindow(object):
self.updat.setFont(font)
self.updat.setStyleSheet("QPushButton {\n"
" padding:10px;\n"
" color: #fffff;\n"
" color: #ffffff;\n"
" font-size: 18px;\n"
" border-radius: 10px;\n"
" border: 1px solid #3873d9;\n"
@ -918,7 +919,7 @@ class Ui_MainWindow(object):
self.Toolbar2: [[self.Upd, "Изменить"], [self.Clear, "Убрать"]],
self.tabWidget: [[self.rasp, "Расписание"], [self.note, "Заметки"]],
self.tabWidget_2: [[self.Show, "Показать"], [self.Doing, "Сделать"],
[self.Adding, "Добавить"], [self.Upating, "Редактрировать"]]}
[self.Adding, "Добавить"], [self.Upating, "Редактировать"]]}
for i in Tabs:
for j in Tabs[i]:
@ -968,8 +969,8 @@ class MyWidget(QMainWindow, Ui_MainWindow):
for i in range(10):
if i > 1:
if weekday[i]:
obj = self.cursor.execute(f"SELECT name FROM "
f"lessons WHERE `id` = {weekday[i]}").fetchone()[0]
obj = self.cursor.execute("SELECT name FROM lessons WHERE `id` = ?",
(weekday[i],)).fetchone()[0]
else:
obj = ""
subjects.append((obj, ))
@ -1083,7 +1084,7 @@ class MyWidget(QMainWindow, Ui_MainWindow):
date.setDateRange(QtCore.QDate.currentDate().addDays(-365), QtCore.QDate.currentDate().addDays(365))
date.setDisplayFormat("HH:mm dd.MM.yyyy")
except Exception:
QMessageBox.about(self, 'Ошибка!', "Неудалось вывести указанное время!")
QMessageBox.about(self, 'Ошибка!', "Не удалось вывести указанное время!")
# РАСПИСАНИЕ
def add(self):
@ -1098,7 +1099,7 @@ class MyWidget(QMainWindow, Ui_MainWindow):
if txt1:
if txt1 not in lessons:
with self.connection:
self.cursor.execute(f"INSERT INTO `lessons` (`name`) VALUES(?)", (txt1,))
self.cursor.execute("INSERT INTO `lessons` (`name`) VALUES(?)", (txt1,))
lessons = self.cursor.execute('SELECT `name` FROM `lessons`').fetchall()
lessons = [i[0] for i in lessons]
with self.connection:
@ -1141,7 +1142,7 @@ class MyWidget(QMainWindow, Ui_MainWindow):
txt = self.upd_line.text()
if txt != "":
with self.connection:
self.cursor.execute(f"UPDATE `lessons` SET `name` = ? WHERE `name` = ?", (txt, obj))
self.cursor.execute("UPDATE `lessons` SET `name` = ? WHERE `name` = ?", (txt, obj))
self.upd_line.clear()
self.table_rasp()
else:
@ -1161,6 +1162,8 @@ class MyWidget(QMainWindow, Ui_MainWindow):
def delete(self):
index = self.choose_obj3.currentText()
if not index: # список предметов пуст
return
with self.connection:
ids = self.cursor.execute("SELECT `id` FROM `lessons` WHERE `name` = ?", (index, )).fetchone()[0]
self.cursor.execute("DELETE FROM `lessons` WHERE `id` = ?", (ids, ))
@ -1178,6 +1181,8 @@ class MyWidget(QMainWindow, Ui_MainWindow):
def check(self):
index, sender = self.choose_obj4.currentText(), self.sender().text()
if not index:
return
with self.connection:
ids = self.cursor.execute("SELECT `id` FROM `lessons` WHERE `name` = ?", (index,)).fetchone()[0]
@ -1256,13 +1261,10 @@ class MyWidget(QMainWindow, Ui_MainWindow):
def add_note(self):
date = self.date_1.dateTime().toString("HH:mm dd.MM.yyyy")
txt = self.write.toPlainText()
day = self.date_1.dateTime().toString()[:2]
# день недели числом (0 — понедельник), не из текста даты: тот зависит от языка системы
day = self.date_1.date().dayOfWeek() - 1
if txt:
for i, elem in enumerate(["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]):
if day == elem:
day = i
break
with self.connection:
self.cursor.execute("INSERT INTO `notes` (`date`, `day`, `note`) VALUES(?,?,?)", (date, day, txt))
self.table_rasp()
@ -1288,7 +1290,7 @@ class MyWidget(QMainWindow, Ui_MainWindow):
if sender == "Показать":
with self.connection:
note = self.cursor.execute(f"SELECT `date`, `note` FROM notes WHERE `id` = {ids}").fetchone()
note = self.cursor.execute("SELECT `date`, `note` FROM notes WHERE `id` = ?", (ids,)).fetchone()
# ОТОБРАЖЕНИЕ ДАТЫ ИЗ БАЗЫ
datetime = note[0].split()
@ -1301,9 +1303,12 @@ class MyWidget(QMainWindow, Ui_MainWindow):
elif sender == "Обновить":
date = self.date_2.dateTime().toString("HH:mm dd.MM.yyyy")
txt = self.write_2.toPlainText()
# при переносе заметки на другую дату меняется и день недели под расписанием
day = self.date_2.date().dayOfWeek() - 1
with self.connection:
self.cursor.execute(f"UPDATE `notes` SET `date` = ?, `note` = ? WHERE `id` = ?", (date, txt, ids))
self.cursor.execute("UPDATE `notes` SET `date` = ?, `day` = ?, `note` = ? WHERE `id` = ?",
(date, day, txt, ids))
self.write_2.clear()
self.table_rasp()
@ -1318,6 +1323,8 @@ class MyWidget(QMainWindow, Ui_MainWindow):
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)
ex = MyWidget()
ex.show()

26
rasp.ui
View file

@ -456,7 +456,7 @@
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -494,7 +494,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -532,7 +532,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -836,7 +836,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -902,7 +902,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -996,7 +996,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -1151,7 +1151,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -1263,7 +1263,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -1386,7 +1386,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -1486,7 +1486,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -1545,7 +1545,7 @@ QPushButton:hover{
</widget>
<widget class="QWidget" name="Upating">
<attribute name="title">
<string>Редактрировать</string>
<string>Редактировать</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
@ -1585,7 +1585,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;
@ -1703,7 +1703,7 @@ QPushButton:hover{
<property name="styleSheet">
<string notr="true">QPushButton {
padding:10px;
color: #fffff;
color: #ffffff;
font-size: 18px;
border-radius: 10px;
border: 1px solid #3873d9;

1
requirements.txt Normal file
View file

@ -0,0 +1 @@
PyQt5==5.15.11