You are on page 1of 7

import tkinter as tk

from tkinter import ttk


from tkinter import messagebox
import sqlite3
from tkinter import *
from tkcalendar import Calendar, DateEntry
from tkinter import filedialog
import datetime
from cryptography.fernet import Fernet

class DiaryApp:

def __init__(self, root):


self.root = root
self.root.title("Diary and Reminder Application")
self.root.geometry("800x650")
ttk.Style().theme_use('winnative')

# Code to Create table in database


try:
conn = sqlite3.connect('data.sqlite')
cursor = conn.cursor()
# cursor.execute('''CREATE TABLE users (id INTEGER,userid TEXT
NOT NULL UNIQUE,password BLOB NOT NULL,username TEXT,email TEXT,PRIMARY
KEY(id AUTOINCREMENT))''')
cursor.execute(
'''CREATE TABLE diary_entries ('diaryid' INTEGER PRIMARY KEY
AUTOINCREMENT,'userid' INTEGER,'dateentry' timestamp,'diarytext' text, FOREIGN KEY
(userid) REFERENCES users(id) )''')
conn.close()
except:
print("Table already exists!")
self.encryptkey = b'OPMWxL8qR-7ONU5PS3sfmAIHI2VqcZBzgkqqjajHRns='
self.fernet = Fernet(self.encryptkey)
self.a_start_page()

def a_start_page(self):
self.start_frame = ttk.Frame(self.root)
self.start_frame.pack(padx=20, pady=20)

ttk.Label(self.start_frame, text="Diary and Reminder Application",


font=("Helvetica", 20, "bold")).pack(pady=20)
ttk.Button(self.start_frame, text="Login", width=15,
command=self.a_login_main).pack(pady=10)
ttk.Button(self.start_frame, text="Register", width=15,
command=self.a_register).pack(pady=10)
ttk.Button(self.start_frame, text="Admin Login", width=15,
command=self.a_login_admin).pack(pady=10)
ttk.Button(self.start_frame, text="Exit", width=15,
command=self.root.quit).pack(pady=10)
self.frames = []

def a_login_main(self):
self.start_frame.destroy()

self.login_frame = ttk.Frame(self.root)
self.login_frame.pack(padx=20, pady=20)
ttk.Label(self.login_frame, text="Login", font=("Helvetica", 16,
"bold")).grid(row=0, column=0, columnspan=2,

pady=10)

ttk.Label(self.login_frame, text="Login ID/User ID:").grid(row=1, column=0,


pady=5)
self.login_id_entry = ttk.Entry(self.login_frame)
self.login_id_entry.grid(row=1, column=1, pady=5)

ttk.Label(self.login_frame, text="Password:").grid(row=2, column=0, pady=5)


self.password_entry = ttk.Entry(self.login_frame, show="")
self.password_entry.grid(row=2, column=1, pady=5)

ttk.Button(self.login_frame, text="Login",
command=self.a_login_main_button).grid(row=3, column=0, columnspan=2,

pady=10)
ttk.Button(self.login_frame, text="Back to Start Page",
command=self.a_login_main_back).grid(row=4, column=0,

columnspan=2,

pady=10)
self.frames = []

def a_login_main_button(self):
login_id = self.login_id_entry.get()
password = self.password_entry.get()

# Code to register user in database


conn = sqlite3.connect('data.sqlite')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE userid = ?", (login_id,))
self.user = cursor.fetchone()
decodedPw = (self.fernet.decrypt(self.user[2])).decode()
if decodedPw == password:
self.dashboard()
selected_date = datetime.datetime.today()
format_string = "%Y-%m-%d"
dateStr = selected_date.strftime(format_string)
print((self.user[0], selected_date))
self.text_entry
# Add the username and password in the database
cursor.execute("select * from diary_entries where userid=? and
entrydate=? ",
(self.user[0], dateStr))
diaryentry = cursor.fetchone()
if diaryentry :
self.text_entry.delete('1.0', END)
self.text_entry.insert('1.0', diaryentry[3])
# Close the database connection
else :
self.text_entry.delete('1.0', END)
self.text_entry.insert(tk.END, "Create your entry")
conn.close()

else:
messagebox.showerror("Error", "Invalid login ID or password!")
def a_login_main_back(self):
self.login_frame.destroy()
self.a_start_page()

def a_register(self):
self.start_frame.destroy()

self.register_frame = ttk.Frame(self.root)
self.register_frame.pack(padx=20, pady=20)

ttk.Label(self.register_frame, text="Register", font=("Helvetica", 16,


"bold")).grid(row=0, column=0,

columnspan=2, pady=10)

ttk.Label(self.register_frame, text="Username:").grid(row=1, column=0,


pady=5)
self.username_entry = ttk.Entry(self.register_frame)
self.username_entry.grid(row=1, column=1, pady=5)

ttk.Label(self.register_frame, text="User ID/Login ID:").grid(row=2,


column=0, pady=5)
self.user_id_entry = ttk.Entry(self.register_frame)
self.user_id_entry.grid(row=2, column=1, pady=5)

ttk.Label(self.register_frame, text="Email:").grid(row=3, column=0, pady=5)


self.email_entry = ttk.Entry(self.register_frame)
self.email_entry.grid(row=3, column=1, pady=5)

ttk.Label(self.register_frame, text="Password:").grid(row=4, column=0,


pady=5)
self.password_entry = ttk.Entry(self.register_frame, show="*")
self.password_entry.grid(row=4, column=1, pady=5)

ttk.Label(self.register_frame, text="Confirm Password:").grid(row=5,


column=0, pady=5)
self.confirm_password_entry = ttk.Entry(self.register_frame, show="*")
self.confirm_password_entry.grid(row=5, column=1, pady=5)

ttk.Button(self.register_frame, text="Register",
command=self.a_register_button).grid(row=6, column=0,

columnspan=2, pady=10)
ttk.Button(self.register_frame, text="Back to Login",
command=self.a_register_back).grid(row=7, column=0,

columnspan=2, pady=10)

def a_register_button(self):

username = self.username_entry.get()
user_id = self.user_id_entry.get()
email = self.email_entry.get()
password = self.password_entry.get()
encodedpw=self.fernet.encrypt(password.encode())
print(username,user_id,email,password)
print(encodedpw , type(encodedpw))
confirm_password = self.confirm_password_entry.get()
if len(user_id) < 1 or len(username) < 1:
messagebox.showerror("Error", "Username and UserId Cannot be empty.")
return

if password.replace(" ", "") == "":


messagebox.showerror("Error", "Please enter Password, Password cannot
contain space.")
return

if password != confirm_password:
messagebox.showerror("Error", "Passwords do not match!")
return
try:
# Code to register user in database
conn = sqlite3.connect('data.sqlite')
cursor = conn.cursor()

# Add the username and password in the database


cursor.execute("INSERT INTO users (userid,password,username,email)
VALUES (?,?,?,?)",
(user_id, encodedpw, username, email))
conn.commit()
# Close the database connection
conn.close()

messagebox.showinfo("Success", "User registered successfully!")


except:
messagebox.showerror("Faliure", "Reqistration failed!")

def a_register_back(self):
self.register_frame.destroy()
self.a_start_page()

def a_login_admin(self):
self.start_frame.destroy()

self.admin_login_frame = ttk.Frame(self.root)
self.admin_login_frame.pack(padx=20, pady=20)

ttk.Label(self.admin_login_frame, text="Admin Login", font=("Helvetica",


16, "bold")).grid(row=0, column=0,

columnspan=2,

pady=10)

ttk.Label(self.admin_login_frame, text="Login ID:").grid(row=1, column=0,


pady=5)
self.login_id_entry = ttk.Entry(self.admin_login_frame)
self.login_id_entry.grid(row=1, column=1, pady=5)

ttk.Label(self.admin_login_frame, text="Password:").grid(row=2, column=0,


pady=5)
self.password_entry = ttk.Entry(self.admin_login_frame, show="*")
self.password_entry.grid(row=2, column=1, pady=5)

ttk.Button(self.admin_login_frame, text="Login",
command=self.a_login_admin_button).grid(row=3, column=0,
columnspan=2, pady=10)
ttk.Button(self.admin_login_frame, text="Back to Login",
command=self.a_login_admin_back).grid(row=4, column=0,

columnspan=2,

pady=10)

def a_login_admin_button(self):
# Code to handle admin login
pass

def a_login_admin_back(self):
self.admin_login_frame.destroy()
self.a_start_page()

def dashboard(self):
self.login_frame.destroy()

self.dashboard_frame = ttk.Frame(self.root)
self.dashboard_frame.pack(padx=20, pady=20)

ttk.Label(self.dashboard_frame, text="Dashboard", font=("Helvetica", 16,


"bold")).grid(row=0, column=0,

columnspan=3, pady=10)

ttk.Label(self.dashboard_frame, text="Text:").grid(row=1, column=0, pady=5)


self.text_entry = tk.Text(self.dashboard_frame, height=10, width=50)
self.text_entry.grid(row=1, column=1, columnspan=2, pady=5)

# Create DateEntry widget


ttk.Label(self.dashboard_frame, text="Date:").grid(row=2, column=0, pady=5)
self.date_entry = DateEntry(self.dashboard_frame, width=12)
self.date_entry.grid(row=2, column=1, pady=5)
# Bind function to date selection event
self.date_entry.bind("<<DateEntrySelected>>", self.date_selected)

ttk.Button(self.dashboard_frame, text="Save",
command=self.b_save).grid(row=3, column=0, pady=10)
ttk.Button(self.dashboard_frame, text="Set Reminder",
command=self.set_reminder).grid(row=3, column=1, pady=10)
ttk.Button(self.dashboard_frame, text="Upload Images",
command=self.upload_images).grid(row=3, column=2,

pady=10)
# Image display area
self.image_label = ttk.Label(self.dashboard_frame)
self.image_label.grid(row=4, column=0, columnspan=3, pady=10)

def upload_images(self):
# Open file dialog to select an image file
file_path = filedialog.askopenfilename(filetypes=[("Image files",
"*.png;*.jpg;*.jpeg")])

if file_path:
# Display the selected image
self.display_image(file_path)
def display_image(self, file_path):
# Open the image file
image = Image.open(file_path)

# Resize the image to fit the display area if necessary


max_width = 400
max_height = 400
image.thumbnail((max_width, max_height), Image.ANTIALIAS)

# Convert the image to Tkinter-compatible format


# tk_image = ImageTk.PhotoImage(image)

# Space for image upload


ttk.Label(self.dashboard_frame, text="Upload Images:").grid(row=4,
column=0, columnspan=3, pady=10)

# Logout button
ttk.Button(self.dashboard_frame, text="Logout",
command=self.b_logout).grid(row=5, column=0, columnspan=3,

pady=10)

def set_reminder(self):
# Code to set reminder
pass

def upload_images(self):
# Code to upload images
pass

def date_selected(self, event):


selected_date = self.date_entry.get_date()
format_string = "%Y-%m-%d"
dateStr = selected_date.strftime(format_string)
try:
self.text_entry.delete("1.0")
conn = sqlite3.connect('data.sqlite')
cursor = conn.cursor()
print((self.user[0], selected_date))
# Add the username and password in the database
cursor.execute("select * from diary_entries where userid=? and
entrydate=? ",
(self.user[0], dateStr))
diaryentry = cursor.fetchone()
self.text_entry.delete('1.0', END)
self.text_entry.insert('1.0', diaryentry[3])
# Close the database connection
conn.close()
except:
self.text_entry.delete('1.0', END)
self.text_entry.insert(tk.END, "No data found on this date")

def b_save(self):
# Get the text and selected date from entry fields and do further
processing
d_newText_data = self.text_entry.get("1.0", tk.END)
selected_date_entry = self.date_entry.get_date()
format_string = "%Y-%m-%d"
dateStr = selected_date_entry.strftime(format_string)
print(type(dateStr))
print(d_newText_data)
try:
# Code to register user in database
conn = sqlite3.connect('data.sqlite')
cursor = conn.cursor()
print(self.user[0], selected_date_entry, d_newText_data)
# Add the username and password in the database --INSERT INTO
diary_entries (userid,date,diarytext) VALUES (2,"2024-03-23","adadad")
cursor.execute("INSERT INTO diary_entries (userid,entrydate,diarytext)
VALUES (?,?,?)",
(self.user[0], dateStr, d_newText_data))
print("Succesfully Inserted!")
conn.commit()
print("Succesfully Commited!")
# Close the database connection
conn.close()

messagebox.showinfo("Success", "Saved successfully!")


except:
messagebox.showerror("Faliure", "Save failed!")

def b_logout(self):
self.dashboard_frame.destroy()
self.a_start_page()

root = tk.Tk()
app = DiaryApp(root)
root.mainloop()

You might also like