Skip to content

Instantly share code, notes, and snippets.

@Vostbur
Created November 2, 2024 19:47
Show Gist options
  • Save Vostbur/9cd4fab98a65ebcd1bc3ab9e47ef1324 to your computer and use it in GitHub Desktop.
Save Vostbur/9cd4fab98a65ebcd1bc3ab9e47ef1324 to your computer and use it in GitHub Desktop.
TODO-list written with GigaCode
# Импортируем необходимые модули
import json
import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QListWidget
from PyQt5.QtCore import Qt
class TodoList(QWidget):
def __init__(self):
# Инициализируем родительский класс
super().__init__()
# Создаем элементы интерфейса
self.todo_input = QLineEdit()
self.add_button = QPushButton('Добавить задачу')
self.delete_button = QPushButton('Удалить задачу')
self.todo_list = QListWidget()
# Создаем макеты
input_layout = QHBoxLayout()
input_layout.addWidget(self.todo_input)
input_layout.addWidget(self.add_button)
input_layout.addWidget(self.delete_button)
layout = QVBoxLayout()
layout.addLayout(input_layout)
layout.addWidget(self.todo_list)
# Устанавливаем макет
self.setLayout(layout)
# Подключаем обработчики событий
self.add_button.clicked.connect(self.add_todo)
self.delete_button.clicked.connect(self.delete_todo)
self.todo_list.itemDoubleClicked.connect(self.select_todo)
self.todo_input.returnPressed.connect(self.add_todo)
# Загружаем задачи при открытии программы
self.load_todos()
def add_todo(self):
# Добавляем новую задачу, если она новая, и заменяем выбранную задачу, если она выбрана для редактирования
todo = self.todo_input.text()
if todo and self.todo_list.currentItem() is None:
if todo not in [item.text() for item in self.todo_list.findItems('', Qt.MatchContains)]:
item = QtWidgets.QListWidgetItem(todo)
item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
item.setCheckState(Qt.Unchecked)
self.todo_list.addItem(item)
self.todo_input.clear()
elif todo and self.todo_list.currentItem():
self.todo_list.currentItem().setText(todo)
self.todo_input.clear()
self.todo_list.setCurrentItem(None)
def delete_todo(self):
# Удаляем выбранную задачу
selected_item = self.todo_list.currentItem()
if selected_item:
self.todo_list.takeItem(self.todo_list.row(selected_item))
def select_todo(self, item):
self.todo_input.setText(item.text())
def save_todos(self):
# Сохраняем задачи в файл 'todos.json'
with open('todos.json', 'w') as f:
todos = []
for item in self.todo_list.findItems('', Qt.MatchContains):
todo = {'text': item.text(), 'checked': item.checkState() == Qt.Checked}
todos.append(todo)
json.dump(todos, f)
def load_todos(self):
# Загружаем задачи из файла 'todos.json'
import os
if not os.path.exists('todos.json'):
with open('todos.json', 'w') as f:
json.dump([], f)
with open('todos.json', 'r') as f:
todos = json.load(f)
for todo in todos:
item = QtWidgets.QListWidgetItem(todo['text'])
item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
item.setCheckState(Qt.Checked if todo['checked'] else Qt.Unchecked)
self.todo_list.addItem(item)
def closeEvent(self, event):
# Сохраняем задачи при закрытии программы
self.save_todos()
super().closeEvent(event)
if __name__ == '__main__':
# Создаем приложение и отображаем окно TodoList
app = QApplication(sys.argv)
todo_list = TodoList()
todo_list.show()
sys.exit(app.exec_())
@Vostbur
Copy link
Author

Vostbur commented Nov 3, 2024

make .exe

pip install Nuitka
python -m nuitka --standalone --onefile --no-pyi-file --remove-output --enable-plugin=pyqt5 .\main.py

maybe

set QT_QPA_PLATFORM_PLUGIN_PATH=D:\projects\todo\venv\Lib\site-packages\PyQt5\Qt\plugins\platforms

where D:\projects\todo\venv path to python venv

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment