A todo app with tkinter
import tkinter as tk
import tkinter.messagebox as msg
import os
import sqlite3
class Todo(tk.Tk):
def __init__(self, tasks=None):
super().__init__()
if not tasks:
self.tasks = []
else:
self.tasks = tasks
self.tasks_canvas = tk.Canvas(self)
self.tasks_frame = tk.Frame(self.tasks_canvas)
self.text_frame = tk.Frame(self)
self.scrollbar = tk.Scrollbar(self.tasks_canvas, orient="vertical", command=self.tasks_canvas.yview)
self.tasks_canvas.configure(yscrollcommand=self.scrollbar.set)
self.title("To-Do App v3")
self.geometry("300x400")
self.task_create = tk.Text(self.text_frame, height=3, bg="gold", fg="black")
self.tasks_canvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.canvas_frame = self.tasks_canvas.create_window((0, 0), window=self.tasks_frame, anchor="n")
self.task_create.pack(side=tk.BOTTOM, fill=tk.X)
self.text_frame.pack(side=tk.BOTTOM, fill=tk.X)
self.task_create.focus_set()
self.colour_schemes = [{"bg": "lightgrey", "fg": "black"}, {"bg": "grey", "fg": "white"}]
current_tasks = self.load_tasks()
for task in current_tasks:
task_text = task[0]
self.add_task(None, task_text, True)
self.bind("<Return>", self.add_task)
self.bind("<Configure>", self.on_frame_configure)
self.bind_all("<MouseWheel>", self.mouse_scroll)
self.bind_all("<Button-4>", self.mouse_scroll)
self.bind_all("<Button-5>", self.mouse_scroll)
self.tasks_canvas.bind("<Configure>", self.task_width)
def add_task(self, event=None, task_text=None, from_db=False):
if not task_text:
task_text = self.task_create.get(1.0, tk.END).strip()
if len(task_text) > 0:
new_task = tk.Label(self.tasks_frame, text=task_text, pady=10)
self.set_task_colour(len(self.tasks), new_task)
new_task.bind("<Button-1>", self.remove_task)
new_task.pack(side=tk.TOP, fill=tk.X)
self.tasks.append(new_task)
if not from_db:
self.save_task(task_text)
self.task_create.delete(1.0, tk.END)
def remove_task(self, event):
task = event.widget
if msg.askyesno("Really Delete?", "Delete " + task.cget("text") + "?"):
self.tasks.remove(event.widget)
delete_task_query = "DELETE FROM tasks WHERE task=?"
delete_task_data = (task.cget("text"),)
self.runQuery(delete_task_query, delete_task_data)
event.widget.destroy()
self.recolour_tasks()
def recolour_tasks(self):
for index, task in enumerate(self.tasks):
self.set_task_colour(index, task)
def set_task_colour(self, position, task):
_, task_style_choice = divmod(position, 2)
my_scheme_choice = self.colour_schemes[task_style_choice]
task.configure(bg=my_scheme_choice["bg"])
task.configure(fg=my_scheme_choice["fg"])
def on_frame_configure(self, event=None):
self.tasks_canvas.configure(scrollregion=self.tasks_canvas.bbox("all"))
def task_width(self, event):
canvas_width = event.width
self.tasks_canvas.itemconfig(self.canvas_frame, width = canvas_width)
def mouse_scroll(self, event):
if event.delta:
self.tasks_canvas.yview_scroll(-1*(event.delta/120), "units")
else:
if event.num == 5:
move = 1
else:
move = -1
self.tasks_canvas.yview_scroll(move, "units")
def save_task(self, task):
insert_task_query = "INSERT INTO tasks VALUES (?)"
insert_task_data = (task,)
self.runQuery(insert_task_query, insert_task_data)
def load_tasks(self):
load_tasks_query = "SELECT task FROM tasks"
my_tasks = self.runQuery(load_tasks_query, receive=True)
return my_tasks
@staticmethod
def runQuery(sql, data=None, receive=False):
conn = sqlite3.connect("tasks.db")
cursor = conn.cursor()
if data:
cursor.execute(sql, data)
else:
cursor.execute(sql)
if receive:
return cursor.fetchall()
else:
conn.commit()
conn.close()
@staticmethod
def firstTimeDB():
create_tables = "CREATE TABLE tasks (task TEXT)"
Todo.runQuery(create_tables)
default_task_query = "INSERT INTO tasks VALUES (?)"
default_task_data = ("--- Add Items Here ---",)
Todo.runQuery(default_task_query, default_task_data)
if __name__ == "__main__":
if not os.path.isfile("tasks.db"):
Todo.firstTimeDB()
todo = Todo()
todo.mainloop()
Subscribe to the newsletter for updates
Tkinter templatesTwitter: @pythonprogrammi - python_pygame
Claude's Games
1. Memory gameVideos
Speech recognition gamePygame's Platform Game
