Untitled
unknown
plain_text
2 years ago
26 kB
3
Indexable
import tkinter as tk from tkinter import ttk from tkPDFViewer import tkPDFViewer import pickle import os import shutil from PIL import ImageTk, Image import mysql.connector as conn from tkinter import filedialog # current_user_adhaar = 405924156291 LoggedIn = False Closed = False _emblem = 'D:\\Addy\Python Files\comp project\emblem.png' _userImage = 'D:\\Addy\Python Files\comp project\%s.png' _logo = 'D:\\Addy\Python Files\comp project\logo.png' _qrCode = 'D:\\Addy\Python Files\comp project\QRcode.png' _icon = "D:\\Addy\Python Files\comp project\icon.png" # Connecting to the MySQL server db = conn.connect(host = 'localhost', user = 'root', password = 'minimilitia1') cur = db.cursor() # Creating Database cur.execute('create database if not exists digilocker') cur.execute('use digilocker') # Creating Table cur.execute("create table if not exists login_details(\ first_name varchar(1000),\ last_name varchar(1000),\ email varchar(1000),\ gender char(1),\ mobile_number bigint not null,\ adhaar_number bigint primary key,\ password varchar(1000),\ dob date)") db.commit() # Function for Error Message pop-up def error(error_message, parent): error_window = tk.Toplevel(parent) error_window.geometry('+550+325') error_window.grab_set() error_label = tk.Label(error_window, text = error_message, font = 'arial 20 bold').pack(padx=10,pady=10) def cmd(): parent.grab_set() error_window.destroy() okay_label = tk.Button(error_window, text = 'OK', font = 'arial 15 bold', borderwidth=5, command=cmd) okay_label.pack(padx = 10, pady = 10) error_window.resizable(False, False) error_window.protocol("WM_DELETE_WINDOW", cmd) # User Screen def create_user_screen(CurrentUser): # Making folder to store User Uploaded Files if not os.path.exists(f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}"): os.makedirs(f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}") try: user_files_paths = open(f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}/file_paths.dat", 'rb') pickle.load(user_files_paths) except: user_files_paths = open(f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}/file_paths.dat", 'wb') pickle.dump({}, user_files_paths) user_files_paths.close() # Function to create Current User's Adhaar Card def adhaar_card_creator(): cur.execute(f'select first_name, last_name, gender, dob, mobile_number, adhaar_number from login_details where adhaar_number = {CurrentUser}') CurrentUser_data = cur.fetchone() def cmd(): view_files_screen.grab_set() adhaar_card_screen.destroy() # Creating Adhaar Card Screen adhaar_card_screen = tk.Toplevel(user_screen) adhaar_card_screen.geometry('800x300+400+150') adhaar_card_screen.title('Adhaar Card') adhaar_card_screen.resizable(False, False) adhaar_card_screen.grab_set() # Emblem resized = Image.open(_emblem).resize((75,75)) adhaar_card_screen.emblem_photo = ImageTk.PhotoImage(resized) logo = tk.Label(adhaar_card_screen, image = adhaar_card_screen.emblem_photo) logo.grid(row = 0, column = 0, sticky = 'nw') # Government of India Heading heading = tk.Label(adhaar_card_screen, text = 'GOVERNMENT OF INDIA', font = 'arial 20 bold').grid(row = 0, column = 1, sticky = 'n', padx = (100, 0)) # User Full Name full_name_label = tk.Label(adhaar_card_screen, text = f'Name: {CurrentUser_data[0]} {CurrentUser_data[1]}', font = 'arial 20 bold').grid(row = 1, column = 1, sticky = 'w') # User DOB dob_label = tk.Label(adhaar_card_screen, text = f'DOB: {CurrentUser_data[3]}', font = 'arial 20 bold').grid(row = 2, column = 1, sticky = 'w') # User Gender gender_label = tk.Label(adhaar_card_screen, text = f"Gender: {'Male' if CurrentUser_data[2] == 'M' else 'Female'}", font = 'arial 20 bold').grid(row = 3, column = 1, sticky = 'w') # User Mobile No. mobile_no_label = tk.Label(adhaar_card_screen, text = f'Mobile No.: {CurrentUser_data[4]}', font = 'arial 20 bold').grid(row = 4, column = 1, sticky = 'w') # User Adhaar Number adhaar_number_label = tk.Label(adhaar_card_screen, text = f'{str(CurrentUser)[0:4]} {str(CurrentUser)[4:8]} {str(CurrentUser)[8:13]}', font = 'arial 20 bold').grid(row = 5, column = 1, sticky = 'w', pady = (30, 0)) # User Image resized = Image.open(_userImage %(CurrentUser_data[2])).resize((150,180)) global user_image user_image = ImageTk.PhotoImage(resized) user_image_label = tk.Label(adhaar_card_screen, image = user_image, borderwidth = 2, relief = 'solid') user_image_label.grid(row = 1, column = 0, padx = 10, rowspan = 5, sticky = 'n') # User QR Code resized = Image.open(_qrCode).resize((150,140)) global qr_code qr_code = ImageTk.PhotoImage(resized) qr_code_logo = tk.Label(adhaar_card_screen, image = qr_code, borderwidth = 2) qr_code_logo.grid(row = 3, column = 2, padx = 10, rowspan = 3) adhaar_card_screen.protocol("WM_DELETE_WINDOW", cmd) # Function to create a window for viewing Uploaded Files def view_files(): # Creating Screen to show uploaded files global view_files_screen view_files_screen = tk.Toplevel(user_screen) view_files_screen.geometry('750x200+400+275') view_files_screen.grab_set() view_files_screen.resizable(False, False) select_file_label = tk.Label(view_files_screen,text="Select File: ", font = 'arial 30 bold').grid(row=0,column=0, padx = 18, pady = 10) # Extracting file paths of all user uploaded documents user_files_paths = open(f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}/file_paths.dat", 'rb') file_path = pickle.load(user_files_paths) user_files_paths.close() file_names = ['Adhaar Card', *file_path.keys()] # Combobox to show files uploaded by Current User files_combo = ttk.Combobox(view_files_screen, value = file_names, font = 'arial 30 bold', state = 'readonly') files_combo.current(0) files_combo.grid(row=0,column=1) def open_file(): document_choice = files_combo.get() if document_choice == 'Adhaar Card': adhaar_card_creator() else: file_format = file_path[document_choice].split('.')[-1] if file_format == 'pdf': # Creating screen to display documnet PDF content pdf_screen = tk.Toplevel(view_files_screen) pdf_screen.geometry('800x800+400+10') pdf_screen.resizable(False, False) pdf_screen.grab_set() # Creating ShowPdf object pdf_obj = tkPDFViewer.ShowPdf() # Adding PDF file path pdf_content = pdf_obj.pdf_view(pdf_screen, pdf_location = file_path[document_choice], width = 800, height = 800) pdf_content.pack() def cmd(): view_files_screen.grab_set() pdf_screen.destroy() pdf_screen.protocol('WM_DELETE_WINDOW', cmd) else: # Creating screen to display the document Image image_screen = tk.Toplevel(view_files_screen) image_screen.geometry('1280x720+160+90') image_screen.resizable(False, False) image_screen.grab_set() # Resizing the document image resized_image = Image.open(file_path[document_choice]).resize((1280,720)) # Creating Label to store document image image_screen.document_image = ImageTk.PhotoImage(resized_image) image_screen.document_image_label = tk.Label(image_screen, image = image_screen.document_image) image_screen.document_image_label.pack() def cmd(): view_files_screen.grab_set() image_screen.destroy() image_screen.protocol('WM_DELETE_WINDOW', cmd) # Open file button open_file_button = tk.Button(view_files_screen, text="Open", command=open_file, font = 'arial 30 bold', borderwidth = 5) open_file_button.grid(row = 2, column = 0, columnspan=2, pady = (20, 20)) # Function to create a window for Uploading Files def upload_file(): # Creating the Upload File Screen filename = '' upload_file_screen = tk.Toplevel(user_screen) upload_file_screen.geometry('950x400+400+250') upload_file_screen.grab_set() upload_file_screen.resizable(False, False) # Function for File Select Dialog Pop-Up def select_file_dialog(): nonlocal filename # Asking User for file path filename = filedialog.askopenfilename(title = 'Open a Document or an Image File', filetypes = (("PDF File", "*.pdf"), ("JPG File", "*.jpg"), ("JPEG File", "*.jpeg"), ("PNG File", "*.png"))) def confirmed_upload_file(): # Loading all previous documents' file paths user_files_paths = open(f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}/file_paths.dat", 'rb') file_paths = pickle.load(user_files_paths) document_name = document_name_entry.get() # Checking if any file is selected if filename: if document_name not in file_paths.keys(): # Copying file from user-given path to user database directory shutil.copy(filename, f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}") # Opening the file again in write mode to delete previous data user_files_paths.close() user_files_paths = open(f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}/file_paths.dat", 'wb') original_file_name = f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}/{filename.split('/')[-1]}" new_file_name = f"C:/ProgramData/MySQL/MySQL Server 8.0/Data/digilocker/users/{CurrentUser}/{document_name}.{filename.split('.')[-1]}" # Adding Document Name with File Path in User File Paths data file file_paths[document_name] = new_file_name pickle.dump(file_paths, user_files_paths) # Renaming file to the same as Document Name os.rename(original_file_name, new_file_name) else: error('There already exists a document with the same name!', upload_file_screen) user_files_paths.close() # Confirm Upload File Button confirmed_upload_file = tk.Button(upload_file_screen, text = 'Upload File', font = 'arial 30 bold', borderwidth = 10, command = confirmed_upload_file) confirmed_upload_file.grid(row = 2, column = 0, columnspan = 2) # Document Name Label document_name_label = tk.Label(upload_file_screen, text = 'Enter Document Name: ',font = 'arial 30 bold') document_name_label.grid(row = 0, column = 0, padx = 15, pady = (20, 40)) # Entry Box to take document name input from user document_name_entry = tk.Entry(upload_file_screen, font = 'arial 30 bold', borderwidth = 5) document_name_entry.grid(row = 0, column = 1, pady = (20, 40)) # Button to Select File for uploading select_file_button = tk.Button(upload_file_screen, text = 'Select File', font = 'arial 30 bold', borderwidth = 10, command = select_file_dialog) select_file_button.grid(row = 1, column = 0, columnspan = 2, pady=(0, 40)) def logout(): global LoggedIn LoggedIn = False user_screen.destroy() def exit(): global Closed Closed = True user_screen.destroy() # Function to Create User Screen Widgets def user_screen_widgets(): # View Files Button View_Files_button=tk.Button(user_screen, text="View Files", command=view_files, font = 'arial 40 bold', borderwidth = 8) View_Files_button.grid(row=0,column=0, padx = 150, pady=(100, 100)) # Upload Files Button Upload_Files_button=tk.Button(user_screen, text = "Upload Files", command = upload_file, font = 'arial 40 bold', borderwidth = 8) Upload_Files_button.grid(row=0,column=1, padx = 150, pady=(10, 10)) # LogOut Button LogOut_button=tk.Button(user_screen, text = "Logout", command = logout, font = 'arial 40 bold', borderwidth = 8) LogOut_button.grid(row=1,column=0, padx = 150, pady=(10, 10)) # Exit Button Exit_button=tk.Button(user_screen, text = "Exit", command = exit, font = 'arial 40 bold', borderwidth = 8) Exit_button.grid(row=1,column=1, padx = 150) # Creating Logo resized = Image.open(_logo).resize((400,200)) global logo_photo logo_photo = ImageTk.PhotoImage(resized) logo = tk.Label(user_screen, image = logo_photo) logo.grid(row = 2, column = 0, columnspan = 2, pady = (50, 0)) # Creating Emblem resized = Image.open(_emblem).resize((150,150)) user_screen.emblem_photo = ImageTk.PhotoImage(resized) logo = tk.Label(user_screen, image = user_screen.emblem_photo) logo.grid(row = 0, column = 0, columnspan = 2, pady = (0, 0)) # Creating Main User Screen if logged in user_screen = tk.Tk() user_screen.geometry('1280x720+160+50') user_screen.iconphoto(True,ImageTk.PhotoImage(Image.open(_icon))) user_screen.title("DigiLocker") user_screen_widgets() user_screen.resizable(False, False) user_screen.protocol('WM_DELETE_WINDOW', exit) user_screen.mainloop() def create_login_register_screen(): # To create Login Screen def login(): # Creating Login Window login_window=tk.Toplevel(root) login_window.geometry('800x250+400+275') login_window.title("Login") login_window.grab_set() login_window.resizable(False, False) # Adhaar Number and Password Label adhaar_number_label=tk.Label(login_window,text="Enter Aadhaar Number:", font = 'arial 30 bold').grid(row=0,column=0) password_label=tk.Label(login_window,text="Enter Password:", font = 'arial 30 bold').grid(row=1,column=0) # Adhaar Number and Password Entry Box adhaar_number_entry=tk.Entry(login_window, font = 'arial 20 bold', borderwidth = 4) adhaar_number_entry.grid(row=0,column=1, padx = (10, 10)) password_entry=tk.Entry(login_window, font = 'arial 20 bold', borderwidth = 4) password_entry.grid(row = 1,column = 1, padx = (10, 10)) def login_cmd(): password = password_entry.get() userExists = False try: adhaar_number = int(adhaar_number_entry.get()) cur.execute(f'select adhaar_number from login_details where adhaar_number = {adhaar_number}') if cur.fetchone(): userExists = True else: error("Account does not exist!", login_window) except: error("Invalid details!", login_window) if userExists: cur.execute(f'select password from login_details where adhaar_number = {adhaar_number}') current_user_password = cur.fetchone()[0] if password == current_user_password: root.destroy() global LoggedIn, current_user_adhaar LoggedIn = True current_user_adhaar = adhaar_number else: error('Incorrect password!', login_window) # Login Button for confirming login login_button_ls=tk.Button(login_window, text="Login", command=login_cmd, font = 'arial 30 bold', borderwidth = 5) login_button_ls.grid(row = 2, column = 0, columnspan=2, pady = (20, 20)) # To create Register Screen def register(): # Creating Register Window register_window=tk.Toplevel(root) register_window.geometry('890x600+400+130') register_window.title("Register") register_window.grab_set() register_window.resizable(False, False) # Creating User Info Labels for registration first_name_label=tk.Label(register_window,text="First Name:", font = 'arial 30 bold').grid(row=0,column=0) last_name_label=tk.Label(register_window,text="Last Name:", font = 'arial 30 bold').grid(row=1,column=0) email_label=tk.Label(register_window,text="Email:", font = 'arial 30 bold').grid(row=2,column=0) gender_label=tk.Label(register_window,text="Gender (M or F):", font = 'arial 30 bold').grid(row=3,column=0) mobile_label=tk.Label(register_window,text="Mobile Number:", font = 'arial 30 bold').grid(row=4,column=0) aadhaar_number_label=tk.Label(register_window,text="Aadhaar Number:", font = 'arial 30 bold').grid(row=5,column=0) dob_label = tk.Label(register_window,text="Date of Birth (YYYY-MM-DD):", font = 'arial 30 bold').grid(row=6,column=0) Password_label=tk.Label(register_window,text="Password:", font = 'arial 30 bold').grid(row=7,column=0) CPassword_label=tk.Label(register_window,text="Confirm Password:", font = 'arial 30 bold').grid(row=8,column=0) # Creating Entry boxes for user to type info first_name_entry=tk.Entry(register_window, font = 'arial 20 bold', borderwidth = 4) first_name_entry.grid(row=0,column=1, padx = (10, 10)) last_name_entry=tk.Entry(register_window, font = 'arial 20 bold', borderwidth = 4) last_name_entry.grid(row=1,column=1, padx = (10, 10)) email_entry=tk.Entry(register_window, font = 'arial 20 bold', borderwidth = 4) email_entry.grid(row=2,column=1, padx = (10, 10)) gender_entry=tk.Entry(register_window, font = 'arial 20 bold', borderwidth = 4) gender_entry.grid(row=3,column=1, padx = (10, 10)) mobile_entry=tk.Entry(register_window, font = 'arial 20 bold', borderwidth = 4) mobile_entry.grid(row=4,column=1, padx = (10, 10)) aadhaar_number_entry=tk.Entry(register_window, font = 'arial 20 bold', borderwidth = 4) aadhaar_number_entry.grid(row=5,column=1, padx = (10, 10)) dob_entry = tk.Entry(register_window, font = 'arial 20 bold', borderwidth = 4) dob_entry.grid(row=6,column=1, padx = (10, 10)) password_entry=tk.Entry(register_window, font = 'arial 20 bold', borderwidth = 4) password_entry.grid(row=7,column=1, padx = (10, 10)) cpassword_entry=tk.Entry(register_window, font = 'arial 20 bold', borderwidth = 4) cpassword_entry.grid(row=8,column=1, padx = (10, 10)) # Function to register the user details in the database def reg_cmd(): # User Registration Data reg_data = { "first_name":first_name_entry.get(), "last_name":last_name_entry.get(), "email":email_entry.get(), "gender":gender_entry.get(), "mobile_number":mobile_entry.get(), "adhaar_number":aadhaar_number_entry.get(), "password":password_entry.get(), "dob": dob_entry.get() } cpassword=cpassword_entry.get() reg_data_values = reg_data.values() # Checking for empty fields check = True for value in reg_data_values: if value != '': pass else: error('The fields cannot be empty!', register_window) check = False break # Confirming Data Validity if check: if str(reg_data["adhaar_number"]).isdigit() and len(str(reg_data["adhaar_number"])) == 12: if cpassword==reg_data["password"]: if reg_data['mobile_number'].isdigit() and len(reg_data['mobile_number']) == 10: if reg_data['gender'] in ('M', 'F'): if '@' in reg_data['email']: if all(map(lambda val: val.isdigit() , reg_data['dob'].split('-'))): dump_query = 'insert into login_details values(%s, %s, %s, %s, %s, %s, %s, %s)' try: cur.execute(dump_query, tuple(reg_data_values)) db.commit() error("You have been registered successfully!", register_window) except: error('An account with this Adhaar Number is already registered!', register_window) else: error('Invalid Date of Birth!', register_window) else: error('Invalid email!', register_window) else: error('Invalid gender!', register_window) else: error("Invalid mobile number!", register_window) else: error("The passwords do not match!", register_window) else: error("Invalid Adhaar Number!", register_window) # Creating Register Button for Registration Window register_button_rs=tk.Button(register_window, text="Register", command=reg_cmd, font = 'arial 30 bold', borderwidth = 5) register_button_rs.grid(row = 9, column = 0, columnspan=2, pady = (20, 20)) # To create Welcome Screen Widgets def welcome_screen_widgets(): # Creating Title title=tk.Label(root, text="WELCOME TO DIGILOCKER", fg="blue", font = 'arial 60 bold') title.grid(row=0,column=0,columnspan=3, padx = (100, 0)) # Creating Login Button Login_button=tk.Button(root, text="Login", command=login, font = 'arial 40 bold', borderwidth = 8) Login_button.grid(row=2,column=0, padx = 150) # Creating Register Button register_button=tk.Button(root, text="Register", command=register, font = 'arial 40 bold', borderwidth = 8) register_button.grid(row=2,column=1,padx=1,pady=50) # Creating Exit Button exit_button=tk.Button(root, text="Exit", command=on_closing, font = 'arial 40 bold', borderwidth = 8) exit_button.grid(row=2,column=2, padx = 150, pady=50) # Creating Slogan slogan=tk.Label(root, text="DOCUMENT WALLET \nTO EMPOWER CITIZENS", fg="blue", font="arial 50 bold") slogan.grid(row = 3, column = 0, columnspan = 3,padx = (100,0)) # Creating Logo resized = Image.open(_logo).resize((400,200)) global photo photo = ImageTk.PhotoImage(resized) logo = tk.Label(root, image = photo) logo.grid(row = 4, column = 0, columnspan = 3) def on_closing(): global Closed Closed = True root.destroy() # Createing Welcome Screen root=tk.Tk() root.geometry('1280x720+160+50') root.iconphoto(True,ImageTk.PhotoImage(file=_icon)) root.title("DigiLocker") welcome_screen_widgets() root.resizable(False, False) root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop() while not Closed: if not LoggedIn: create_login_register_screen() else: create_user_screen(current_user_adhaar)
Editor is loading...