From bfb514297066f9dd216f6607357bb3e1a0ace4e0 Mon Sep 17 00:00:00 2001 From: s490035 Date: Thu, 20 Jun 2024 12:16:55 +0200 Subject: [PATCH] Upload files to "/" --- README.md | 27 ++++++++ to-do-app.py | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 README.md create mode 100644 to-do-app.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..d806e72 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Instalacja - Hubert Marciniak +Requirments: +python3 +tkinter +sqlite3 + +Linux: +1. install python3, tkinter, sqlite3 if you don't have: + sudo apt install python3 python3-tk sqlite3 +2. download to-do-app.py to your directory +3. use cd to go to the directory with downloaded file: + cd /path/to/your/directory +4. run the app: + python3 todo_app.py + + +Windows: +1. install python from python website if you don't have +2. intall tkinter if you don't have (sqlite3 should come with python): + pip install tk +3. download to-do-app.py to your directory +4. use cd to go to the directory with downloaded file: + cd /path/to/your/directory +5. run the app: + python todo_app.py + + diff --git a/to-do-app.py b/to-do-app.py new file mode 100644 index 0000000..09119ff --- /dev/null +++ b/to-do-app.py @@ -0,0 +1,170 @@ +import sqlite3 +import tkinter as tk +from tkinter import messagebox + +def create_db(): + conn = sqlite3.connect('tasks.db') + cursor = conn.cursor() + cursor.execute(''' + CREATE TABLE IF NOT EXISTS Tasks ( + id INTEGER PRIMARY KEY, + title TEXT NOT NULL, + completed BOOLEAN NOT NULL + ) + ''') + conn.commit() + conn.close() + +create_db() + + + +class Task: + def __init__(self, taskname, isdone=False): + self.taskname = taskname + self.isdone = isdone + + def get_tasks(): + connection = sqlite3.connect('tasks.db') + cursor = connection.cursor() + cursor.execute('SELECT * FROM Tasks') + tasks = cursor.fetchall() + connection.close() + tasks_list = [{'id': row[0], 'title': row[1], 'completed': row[2]} for row in tasks] + return tasks_list + + def add_task(taskname): + connection = sqlite3.connect('tasks.db') + new_task = Task(taskname=taskname, isdone=False) + cursor = connection.cursor() + cursor.execute('INSERT INTO Tasks (title, completed) VALUES (?, ?)', (new_task.taskname, new_task.isdone)) + connection.commit() + connection.close() + + def delete_task(task_id): + connection = sqlite3.connect('tasks.db') + cursor = connection.cursor() + cursor.execute('DELETE FROM Tasks WHERE id = ?', (task_id,)) + connection.commit() + connection.close() + + + def delete_all(): + connection = sqlite3.connect('tasks.db') + cursor = connection.cursor() + cursor.execute('DELETE FROM Tasks') + connection.commit() + connection.close() + + def mark_as_done(task_id): + connection = sqlite3.connect('tasks.db') + cursor = connection.cursor() + cursor.execute('UPDATE Tasks SET completed = ? WHERE id = ?', (True, task_id)) + connection.commit() + connection.close() + +class TaskApp: + def __init__(self, root): + self.root = root + root.configure(bg='lightblue') + self.root.title("To-do App") + + buttonfont=('Arial', 10) + tk.Label(root, text='Your Tasks', bg='lightblue', font=('Arial', 20)).grid(row=0, column=0, columnspan=3, padx=5, pady=10) + + self.task_listbox = tk.Listbox(root, width=45, height=15, bg='light yellow', selectmode=tk.SINGLE) + self.task_listbox.grid(row=1, column=0, columnspan=3, padx=0, pady=5) + + tk.Label(root, text="Enter new task:", bg='lightblue', font=buttonfont).grid(row=2, column=0, padx=5, pady=5) + self.entry_task = tk.Entry(root, width=25, bg='light yellow') + self.entry_task.grid(row=2, column=1, padx=0, pady=5) + + self.add_button = tk.Button(root, text="Add Task", bg='light yellow', font=buttonfont, width=10, command=self.add_task) + self.add_button.grid(row=2, column=2, columnspan=1, padx=5, pady=5) + + self.delete_button = tk.Button(root, text="Delete Task", bg='light yellow', font=buttonfont,width=10, command=self.delete_task) + self.delete_button.grid(row=4, column=0, columnspan=2, padx=2, pady=5, sticky=tk.E) + + self.complete_button = tk.Button(root, text="Mark as done", bg='light yellow', font=buttonfont,width=10, command=self.mark_as_done) + self.complete_button.grid(row=4, column=0, columnspan=2, pady=5, padx=10, sticky=tk.W) + + self.delete_all_button = tk.Button(root, text="Delete All", bg='light yellow', font=buttonfont,width=10, command=self.delete_all) + self.delete_all_button.grid(row=4, column=2, columnspan=1, pady=5, padx=5) + + self.search_entry = tk.Entry(root, width=25, bg='light yellow') + self.search_entry.grid(row=3, column=1, padx=0, pady=5) + + tk.Label(root, text="Enter task to search:", bg='lightblue', font=buttonfont).grid(row=3, column=0, padx=5, pady=5) + self.search_button = tk.Button(root, text="Search Task", bg='light yellow', font=buttonfont,width=10, command=self.search_task) + self.search_button.grid(row=3, column=2, columnspan=1, padx=5, pady=5) + + self.sort_button = tk.Button(root, text="Sort Tasks", bg='light yellow', font=buttonfont,width=10, command=self.sort_tasks) + self.sort_button.grid(row=4, column=0, columnspan=2, pady=5, padx=(14,5)) + + self.load_tasks() + + def load_tasks(self): + self.task_listbox.delete(0, tk.END) + tasks = Task.get_tasks() + for task in tasks: + task_str = f"{task['title']} - {'Done' if task['completed'] else 'Not Done'}" + self.task_listbox.insert(tk.END, task_str) + + def add_task(self): + taskname = self.entry_task.get() + if taskname: + Task.add_task(taskname) + self.load_tasks() + self.entry_task.delete(0, tk.END) + else: + messagebox.showwarning("Warning", "Task name cannot be empty") + + def delete_task(self): + try: + selected_task_index = self.task_listbox.curselection()[0] + selected_task_name = self.task_listbox.get(selected_task_index).split(' - ')[0] + task_id = [task['id'] for task in Task.get_tasks() if task['title'] == selected_task_name][0] + Task.delete_task(task_id) + self.load_tasks() + except IndexError: + messagebox.showwarning("Warning", "Please select a task to delete") + + def delete_all(self): + Task.delete_all() + self.load_tasks() + + def mark_as_done(self): + try: + selected_task_index = self.task_listbox.curselection()[0] + selected_task_name = self.task_listbox.get(selected_task_index).split(' - ')[0] + task_id = [task['id'] for task in Task.get_tasks() if task['title'] == selected_task_name][0] + Task.mark_as_done(task_id) + self.load_tasks() + except IndexError: + messagebox.showwarning("Warning", "Please select a task to complete") + + def search_task(self): + search_text = self.search_entry.get() + if search_text: + tasks = Task.get_tasks() + for index, task in enumerate(tasks): + if search_text.lower() in task['title'].lower(): + self.task_listbox.select_set(index) + return + messagebox.showinfo("Info", f"Task not found") + else: + messagebox.showwarning("Warning", "Search text cannot be empty") + + def sort_tasks(self): + tasks = Task.get_tasks() + sorted_tasks = sorted(tasks, key=lambda x: (not x['completed'])) + self.task_listbox.delete(0, tk.END) + for task in sorted_tasks: + task_str = f"{task['title']} - {'Done' if task['completed'] else 'Not Done'}" + self.task_listbox.insert(tk.END, task_str) + +if __name__ == "__main__": + root = tk.Tk() + app = TaskApp(root) + root.mainloop() +