Created
November 2, 2024 19:47
-
-
Save Vostbur/9cd4fab98a65ebcd1bc3ab9e47ef1324 to your computer and use it in GitHub Desktop.
TODO-list written with GigaCode
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Импортируем необходимые модули | |
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_()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
make .exe
maybe
where
D:\projects\todo\venv
path to python venv