Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
5 views

Coding Documentation

Uploaded by

jasaj69412
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views

Coding Documentation

Uploaded by

jasaj69412
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 43

Coding Implementation and App Documentation

Libraries/Modules used: 1. customtkinter (highly-customized


tkinter library)
2. requests
3. CtkTable (for customized tkinter Table
widgets)
4. threading
5. mysql-connector-python
6. speedtest-cli (for speedtest)
7. time
8. datetime
File Structure:

Short Description of each file:


1. app.py : It is the main file responsible for the app’s main functionality
as well as UI. It has over 989 lines of code.

2. dashboard.py : It contains several functions related to the dashboard


of the app. It has over 48 lines of code.

3. employee.py : It contains functions related to Employee tab. It has


over 21 lines of code.

4. genreports.py : It returns financial reports. It has over 21 lines of


code.

5. hotel.py : It is used to perform functions related to Hotel


Infrastructure tab. It has over 22 lines of code.

6. usefulfunctions.py : It contains several useful functions related to


Dashboard, as well as functionality of adding Guests and Rooms. It has
over 71 lines of code.

App Design
Code along with Filenames:
1. dashboard.py
import requests
import mysql.connector
import speedtest
import time

# used for checking existence of given username input


def availability(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM userinfo WHERE
usname='{username}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

# fetches userdata to be displayed on dashboard


def getuserdata(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT usname,emailid,hotelname FROM userinfo where
usname='{username}';"
cur.execute(statement)
result=cur.fetchone()
conn.close()
return result

# fetches location from IP address


def getlocation(ip):
response=requests.get(f"https://ipinfo.io/{ip}/json")
data=response.json()
return data

# fetches IP address
def getip():
publicip=requests.get("https://api.ipify.org").text
return publicip

# returns internet speed using Ookla Speedtest


def getspeed():
st=speedtest.Speedtest()
starttime=time.time()
# get best server on based on ping
st.get_best_server()
download=round(st.download()/1_000_000)
upload=round(st.upload()/1_000_000)
ping=round(st.results.ping)
endtime=time.time()
totaltime=round(endtime-starttime,2)
result=f"Time taken:{totaltime}seconds\nDownload:{download}Mbps\
nUpload:{upload}Mbps\nPing:{ping}ms"
return result

2. employee.py
import mysql.connector

def getemployee(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT first_name, last_name, position, department,
hire_date, salary FROM hotel_employees WHERE username='{username}';"
cur.execute(statement)
result=cur.fetchall()
columns=[("first_name", "last_name", "position", "department",
"hire_date", "salary")]
finalresult=columns+result
conn.close()
return finalresult

def getempcount(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM hotel_employees WHERE
username='{username}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result
3. genreports.py
import mysql.connector

def getfinance(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT yearly, total_revenue, total_expenses,
net_income, adr, occupancy_rate FROM financial WHERE
username='{username}';"
cur.execute(statement)
result=cur.fetchall()
columns=[("yearly", "total_revenue", "total_expenses",
"net_income", "adr", "occupancy_rate")]
finalresult=columns+result
conn.close()
return finalresult

def financecount(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM financial WHERE
username='{username}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

4. hotel.py
import mysql.connector

def gethotelinfra(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT component_name,floor_number,quantity,purpose
FROM hotel_infrastructure WHERE username='{username}';"
cur.execute(statement)
result=cur.fetchall()
columns=[("Component","Quantity","Floor","Purpose")]
finalresult=columns+result
conn.close()
return finalresult

def counthotelinfra(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM hotel_infrastructure WHERE
username='{username}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

5. usefulfunctions.py
import datetime
import mysql.connector

def gettime():
current_time=datetime.datetime.now()
return current_time

def timearrangedata():
timenow=gettime()
year=str(timenow.year)
day=str(timenow.day)
monthnum=timenow.month

dict1={1:"January",2:"February",3:"March",4:"Arpil",5:"May",6:"June",7:
"July",8:"August",9:"August",10:"October",11:"November",12:"December"}
month=dict1[monthnum]
return "Today's date:\n"+day + " " + month+", " + year

def addguests(name,addr,ph,stay,arr,depar,accomp,rooms,username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"INSERT INTO guestsinfo(Guestname, address ,phno,
stayduration,arrival_date,departure_date,accompanies,rooms_occupied,use
rname) VALUES('{name}','{addr}','{ph}',{stay},'{arr}','{depar}',
{accomp},{rooms},'{username}');"
cur.execute(statement)
conn.commit()
conn.close()

def retrievedata(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT
Guestname,address,phno,stayduration,arrival_date,departure_date,accompa
nies,rooms_occupied FROM guestsinfo WHERE username='{username}';"
cur.execute(statement)
results=cur.fetchall()
columns=[("Guest Name","address","Phone
No:","stayduration","arrival date","departure date","No of persons
accompanying","rooms occupied")]
results=columns+results
conn.close()
return results

def countrecord(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM guestsinfo WHERE
username='{username}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

def getrooms(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT room,occupied FROM roomallocate WHERE
username='{username}';"
cur.execute(statement)
results=cur.fetchall()
finalresult=[]
for i in results:
if i[1]==True:
l1=[i[0],"Occupied"]
else:
l1=[i[0],"Empty"]
finalresult.append(l1)
columns=[("Room No.","Status")]
finalresult=columns+finalresult
conn.close()
return finalresult

def getcount(username):

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM roomallocate WHERE
username='{username}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

6. app.py
import customtkinter as ctk
import requests
root=ctk.CTk()
root.geometry("600x500")
root.title("Hosthub Hotel Management Software")
root.resizable(False,False)
# themes and colours
ctk.set_default_color_theme("dark-blue")
ctk.set_appearance_mode("dark")
# root.iconbitmap("hotel2.ico")
# mysql connectivity
import mysql.connector

# separate custom imports


from hotel import *
from usefulfunctions import *
from genreports import *
from employee import *
from dashboard import *
from CTkTable import *
import threading

# used for globally accessible data


realusername=""

def maincontentlogin(username):
root2=ctk.CTk()
root2.geometry("1400x600")
root2.title("Hosthub Hotel Management Software")
# root2.iconbitmap("hotel2.ico")
root2.resizable(True,True)
greetlabel=ctk.CTkLabel(root2,text=f"Welcome back,
{username}!",font=('Microsoft YaHei UI',30,"bold"))
# notebook sidebar (tabview)
tabview1=ctk.CTkTabview(root2,corner_radius=15,height=330)
tabview1.add("Dashboard")
tabview1.add("Guests Record")
tabview1.add("Room Allocation")
tabview1.add("Hotel Infrastructure")
tabview1.add("Employees")
tabview1.add("Financial")

# dashboard work
date=timearrangedata()

label1=ctk.CTkLabel(tabview1.tab("Dashboard"),text=date,font=("Montserr
at",15,"normal"),width=50)
userdata=getuserdata(username)
usname,emid,htname=userdata[0],userdata[1],userdata[2]
global label2
label2=ctk.CTkLabel(tabview1.tab("Dashboard"),text=f"Username:
{usname}\nEmail Id: {emid}\nHotel name: {htname}",font=('Microsoft
YaHei',15))
# slabs

# get location
ip=getip()
location=getlocation(ip)
label3=ctk.CTkLabel(tabview1.tab("Dashboard"),text=f"Location:
{location['city']},{location['region']},
{location['country']}",font=('Microsoft YaHei UI',15))
label3.grid(column=1,row=2)

# weather

label4=ctk.CTkLabel(tabview1.tab("Dashboard"),text="Weather:",font=('Mi
crosoft YaHei UI',15))
label4.grid(column=3,row=2)
coordinates=location['loc'].split(",")
lat=coordinates[0]
lon=coordinates[1]
# use open-meteo
respon=requests.get(f"https://api.open-meteo.com/v1/forecast?
latitude={lat}&longitude={lon}&current_weather=true")
data=respon.json()
dict1=data['current_weather']
temp1=f"Temperature:{dict1['temperature']}degrees celsius"
wind1=f"Windspeed:{dict1['windspeed']}km/h"
finaldata=f"{temp1}\n{wind1}"

label10=ctk.CTkLabel(tabview1.tab("Dashboard"),text=finaldata,font=('Mi
crosoft YaHei Light',15))
label10.grid(column=3,row=3)

def editprofile():

def changehotel():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"UPDATE userinfo SET
hotelname='{newhname.get()}' WHERE usname='{realusername}';"
cur.execute(statement)
conn.commit()
conn.close()
successmsg=ctk.CTkLabel(dashwindow,text="Modified
Successfully!",text_color="green")
successmsg.grid(column=3,row=2)
newhname.delete(0,ctk.END)
def clearsuccessmsg():
successmsg.destroy()
successmsg.after(3000,clearsuccessmsg)

def changepwd():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"UPDATE userinfo SET pwd='{newpwd.get()}' WHERE
usname='{realusername}';"
cur.execute(statement)
conn.commit()
conn.close()
successmsg=ctk.CTkLabel(dashwindow,text="Modified
Successfully!",text_color="green")
successmsg.grid(column=3,row=3)
newpwd.delete(0,ctk.END)
def clearsuccessmsg():
successmsg.destroy()
successmsg.after(3000,clearsuccessmsg)

def changemail():
conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"UPDATE userinfo SET emailid='{newmail.get()}'
WHERE usname='{realusername}';"
cur.execute(statement)
conn.commit()
conn.close()
successmsg=ctk.CTkLabel(dashwindow,text="Modified
Successfully!",text_color="green")
successmsg.grid(column=3,row=4)
newmail.delete(0,ctk.END)
def clearsuccessmsg():
successmsg.destroy()
successmsg.after(3000,clearsuccessmsg)

global dashwindow,newhname,newpwd,newmail
dashwindow=ctk.CTk()
dashwindow.title("Edit Profile")
dashwindow.geometry("600x300")
dashwindow.resizable(False,False)
usernamelabel=ctk.CTkLabel(dashwindow,text=f"Username:
{realusername}",font=('Raleway',15,"bold"))
newhname=ctk.CTkEntry(dashwindow,placeholder_text="New Hotel
Name : ")
newpwd=ctk.CTkEntry(dashwindow,placeholder_text="New
password:")
newmail=ctk.CTkEntry(dashwindow,placeholder_text="New Email
ID:")

changehnamebtn=ctk.CTkButton(dashwindow,text="Change Hotel
name",command=changehotel)
changepwdbtn=ctk.CTkButton(dashwindow,text="Change
Password",command=changepwd)
changeemailbtn=ctk.CTkButton(dashwindow,text="Change Email
ID",command=changemail)

changeemailbtn.grid(column=2,row=4)
changehnamebtn.grid(column=2,row=2)
changepwdbtn.grid(column=2,row=3)
usernamelabel.grid(column=2,row=1)
newmail.grid(column=1,row=4)
newhname.grid(column=1,row=2)
newpwd.grid(column=1,row=3)
dashwindow.columnconfigure((1,2,3,4),weight=1)
dashwindow.rowconfigure((1,2,3,4,5,6),weight=1)
dashwindow.mainloop()
btn11=ctk.CTkButton(tabview1.tab("Dashboard"),text="Edit
Profile",command=editprofile,fg_color="#3d84db",hover_color="#166fdb",t
ext_color="white")
btn11.grid(column=3,row=4)

def getrefreshdashboard():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT usname,emailid,hotelname FROM userinfo where
usname='{realusername}';"
cur.execute(statement)
result=cur.fetchone()
conn.close()
return result

def refreshdashboard():
global label2
label2.destroy()
data=getrefreshdashboard()
username,hotelname,emailid=data[0],data[2],data[1]
label2=ctk.CTkLabel(tabview1.tab("Dashboard"),text=f"Username:
{username}\nEmail Id: {emailid}\nHotel name:
{hotelname}",font=('Microsoft YaHei',15))
label2.grid(column=3,row=0,sticky=('ew'))

btn12=ctk.CTkButton(tabview1.tab("Dashboard"),text="Refresh",fg_color="
#f2fafa",hover_color="#e1fafa",text_color="black",command=refreshdashbo
ard)
btn12.grid(column=3,row=5)
# get internet speed
def activateinternet():
global label6,label5
label5=ctk.CTkLabel(tabview1.tab("Dashboard"),text="Please wait
for about 60 seconds:")
label5.grid(column=1,row=4)
def threadfunc():
global label6
info=getspeed()

label6=ctk.CTkLabel(tabview1.tab("Dashboard"),text=info,font=('Microsof
t YaHei UI',20))
label6.grid(column=1,row=5)
global clearbtn2
clearbtn2=ctk.CTkButton(tabview1.tab("Dashboard"),text="Clear",command=
clear2)
clearbtn2.grid(column=1,row=6)
threading.Thread(target=threadfunc).start()
def clear2():
label5.destroy()
label6.destroy()
clearbtn2.destroy()

speedbtn1=ctk.CTkButton(tabview1.tab("Dashboard"),text="Check
Internet
Speed",fg_color="#fc4454",hover_color="#fc2638",command=activateinterne
t)
speedbtn1.grid(column=1,row=3)

tabview1.tab("Dashboard").columnconfigure((1,2,3),weight=1)
tabview1.tab("Dashboard").rowconfigure((1,2,3,4,5,6,7),weight=1)

label1.grid(column=1,row=1,sticky=('ew'))
label2.grid(column=3,row=0,sticky=('ew'))

# current guests work


scrollableframe2=ctk.CTkScrollableFrame(tabview1.tab("Guests
Record"),width=1350)
scrollableframe2.grid(row=1)
value=retrievedata(username)

def addguestwindow():
win2=ctk.CTk()
win2.title("Add Guests!")
win2.geometry("700x700")
global
gstnamedata,addrdata,phdata,durdata,Arrdata,deparrdata,accompdata,roomo
ccup

gstnamedata=ctk.CTkEntry(win2,placeholder_text="Guest
name:",width=200)

addrdata=ctk.CTkEntry(win2,placeholder_text="Address:",width=200)
phdata=ctk.CTkEntry(win2,placeholder_text="Phone
No:",width=200)
durdata=ctk.CTkEntry(win2,placeholder_text="Duration of
Stay:",width=200)
Arrdata=ctk.CTkEntry(win2,placeholder_text="Arrival Date (YYYY-
MM-DD):",width=200)
deparrdata=ctk.CTkEntry(win2,placeholder_text="Departure Date
(YYYY-MM-DD):",width=200)
accompdata=ctk.CTkEntry(win2,placeholder_text="No of persons
accompanying:",width=200)
roomoccup=ctk.CTkEntry(win2,placeholder_text="No of rooms
occupied:",width=200)

def addactivate():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()

successmsg=ctk.CTkLabel(win2,text="Successful!",text_color="green")
successmsg.grid(column=1,row=10)
global
gstnamedata,addrdata,phdata,durdata,Arrdata,deparrdata,accompdata,roomo
ccup
statement=f"INSERT INTO guestsinfo(Guestname,
address ,phno,
stayduration,arrival_date,departure_date,accompanies,rooms_occupied,use
rname) VALUES
('{gstnamedata.get()}','{addrdata.get()}','{phdata.get()}',
{durdata.get()},'{Arrdata.get()}','{deparrdata.get()}',
{accompdata.get()},{roomoccup.get()},'{realusername}');"
cur.execute(statement)
conn.commit()
conn.close()
gstnamedata.delete(0,ctk.END)
addrdata.delete(0,ctk.END)
phdata.delete(0,ctk.END)
durdata.delete(0,ctk.END)
Arrdata.delete(0,ctk.END)
deparrdata.delete(0,ctk.END)
accompdata.delete(0,ctk.END)
roomoccup.delete(0,ctk.END)
def removemsg():
successmsg.grid_forget()
successmsg.after(3000,removemsg)

addbtn=ctk.CTkButton(win2,text="Add Guest",command=addactivate)
greet1=ctk.CTkLabel(win2,text="Fill up the details!")

greet1.grid(row=0,column=1)
addbtn.grid(row=9,column=1)
gstnamedata.grid(row=1,column=1)
addrdata.grid(row=2,column=1)
phdata.grid(row=3,column=1)
durdata.grid(row=4,column=1)
Arrdata.grid(row=5,column=1)
deparrdata.grid(row=6,column=1)
accompdata.grid(row=7,column=1)
roomoccup.grid(row=8,column=1)
win2.columnconfigure((0,1,2),weight=1)
win2.rowconfigure((0,1,2,3,4,5,6,7,8,9,10,11),weight=1)
win2.mainloop()
global table1
table1=CTkTable(scrollableframe2,column=8,row=countrecord(username)
+1,values=value,hover_color="grey")
tabview1.tab("Guests Record").rowconfigure((0,1,2),weight=1)
table1.grid(row=1)
# refresh guests

def refreshguestdata():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT Guestname, address ,phno,
stayduration,arrival_date,departure_date,accompanies,rooms_occupied
FROM guestsinfo WHERE username='{realusername}';"
cur.execute(statement)
results=cur.fetchall()
columns=[("Guest Name","address","Phone
No:","stayduration","arrival date","departure date","No of persons
accompanying","rooms occupied")]
results=columns+results
conn.close()
return results
def getrefreshguestcount():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM guestsinfo WHERE
username='{username}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

def refreshguest():
global table1
table1.destroy()
value1=refreshguestdata()
table1=CTkTable(scrollableframe2,column=8,row=getrefreshguestcount()
+1,values=value1,hover_color="grey")
table1.grid(row=1)

refreshguestbtn=ctk.CTkButton(tabview1.tab("Guests
Record"),text="Refresh",command=refreshguest)
refreshguestbtn.grid(row=2)

# add guests functionality


addbtn=ctk.CTkButton(tabview1.tab("Guests Record"),text="Add
Guest",fg_color="#d14fcd",hover_color="#d115cb",command=addguestwindow)
addbtn.grid(row=0)

def addroom():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
global window,roomnum

successmsg=ctk.CTkLabel(window,text="Success!",text_color="green")
successmsg.grid(row=5,column=1)
cur=conn.cursor()
statement=f"INSERT INTO roomallocate
(room,username,occupied)VALUES({roomnum.get()},'{realusername}',
{shared_value.get()});"
cur.execute(statement)
conn.commit()
conn.close()
roomnum.delete(0,ctk.END)
def removemsg():
successmsg.grid_forget()
successmsg.after(3000,removemsg)

def editroom():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()

successmsg=ctk.CTkLabel(window3,text="Success!",text_color="green")
successmsg.grid(column=1,row=5)
statement=f"UPDATE roomallocate SET
occupied={shared_value2.get()} WHERE username='{realusername}' AND
room={roomnum2.get()};"
cur.execute(statement)
conn.commit()
conn.close()
roomnum2.delete(0,ctk.END)
def removemsg():
successmsg.grid_forget()
successmsg.after(3000,removemsg)

def removeroom():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
global window2

successmsg=ctk.CTkLabel(window2,text="Success!",text_color="green")
successmsg.grid(row=4,column=1)
statement=f"DELETE FROM roomallocate WHERE
username='{realusername}' AND room={roomnum3.get()};"
cur.execute(statement)
conn.commit()
conn.close()
roomnum3.delete(0,ctk.END)

def removemsg():
successmsg.grid_forget()
successmsg.after(3000,removemsg)

def editroomwindow():
global window3
window3=ctk.CTk()
window3.title("Edit Room")
window3.geometry("400x400")
window3.resizable(False,False)
global roomnum2,shared_value2

roomnum2=ctk.CTkEntry(window3,placeholder_text="Room No:")
label2=ctk.CTkLabel(window3,text="Occupied?")
shared_value2=ctk.BooleanVar(value=False)

choiceyes=ctk.CTkRadioButton(window3,text="Yes",variable=shared_value2,
value=True)

choiceno=ctk.CTkRadioButton(window3,text="No",variable=shared_value2,va
lue=False)

donebtn=ctk.CTkButton(window3,text="Done",command=editroom)

#grid
roomnum2.grid(column=1,row=1)
label2.grid(column=1,row=2)
choiceyes.grid(column=0,row=3)
choiceno.grid(column=2,row=3)
donebtn.grid(column=1,row=4)

window3.columnconfigure((0,1,2),weight=1)
window3.rowconfigure((1,2,3,4,5,6),weight=1)
window3.mainloop()

def delroomwindow():
global window2
window2=ctk.CTk()
window2.title("Delete Room")
window2.geometry("250x250")
window2.resizable(False,False)

global roomnum3

roomnum3=ctk.CTkEntry(window2,placeholder_text="Room No:")

delbtn=ctk.CTkButton(window2,text="Delete",command=removeroom,fg_color=
"#fc4454",hover_color="#fc2638")

roomnum3.grid(column=1,row=1)
delbtn.grid(column=1,row=3)

window2.rowconfigure((1,2,3,4,5),weight=1)
window2.columnconfigure((0,1,2),weight=1)
window2.mainloop()

def addroomwindow():
global window
window=ctk.CTk()
window.title("Add Room")
window.geometry("500x500")
window.resizable(False,False)

global roomnum,shared_value

roomnum=ctk.CTkEntry(window,placeholder_text="Room No:")
label1=ctk.CTkLabel(window,text="Occupied?")
shared_value=ctk.BooleanVar(value=False)

choiceyes=ctk.CTkRadioButton(window,text="Yes",variable=shared_value,va
lue=True)

choiceno=ctk.CTkRadioButton(window,text="No",variable=shared_value,valu
e=False)
donebtn=ctk.CTkButton(window,text="Done",command=addroom)

#grid
roomnum.grid(column=1,row=1)
label1.grid(column=1,row=2)
choiceyes.grid(column=0,row=3,sticky=ctk.N+ctk.E)
choiceno.grid(column=2,row=3,sticky=ctk.N+ctk.W)
donebtn.grid(column=1,row=4)

window.rowconfigure((1,2,3,4,5,6),weight=1)
window.columnconfigure((0,1,2),weight=1)

window.mainloop()
# room allocation
global scrollableframe1
scrollableframe1=ctk.CTkScrollableFrame(tabview1.tab("Room
Allocation"),width=300)

# room table
global table2,value2
value2=getrooms(realusername)

table2=CTkTable(scrollableframe1,column=2,row=getcount(realusername)
+1,values=value2,hover_color="#a3abb8")
table2.grid()

def refreshgetrooms():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT room,occupied FROM roomallocate WHERE
username='{realusername}';"
cur.execute(statement)
results=cur.fetchall()
conn.close()
finalresult=[]
for i in results:
if i[1]==True:
l1=[i[0],"Occupied"]
else:
l1=[i[0],"Empty"]
finalresult.append(l1)
columns=[("Room No.","Status")]
finalresult=columns+finalresult
return finalresult
def refreshgetcount():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM roomallocate WHERE
username='{realusername}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

def refreshrooms():
global table2
table2.destroy()
value3=refreshgetrooms()

table2=CTkTable(scrollableframe1,column=2,hover_color="#a3abb8",row=ref
reshgetcount()+1,values=value3)
table2.grid()

addroombtn=ctk.CTkButton(tabview1.tab("Room Allocation"),text="Add
Room",command=addroomwindow,fg_color="#76ad74",hover_color="#51ad4e")
editroombtn=ctk.CTkButton(tabview1.tab("Room
Allocation"),text="Edit Room",command=editroomwindow)
removeroombtn=ctk.CTkButton(tabview1.tab("Room
Allocation"),text="Remove
Room",fg_color="#fc4454",hover_color="#fc2638",command=delroomwindow)
refreshbtn=ctk.CTkButton(tabview1.tab("Room
Allocation"),text="Refresh",command=refreshrooms)
# config state buttons

tabview1.tab("Room Allocation").rowconfigure((0,1,2),weight=1)
tabview1.tab("Room Allocation").columnconfigure((0,1,2),weight=1)
addroombtn.grid(row=0,column=0)
editroombtn.grid(row=2,column=0)
removeroombtn.grid(row=0,column=2)
refreshbtn.grid(row=2,column=2)
scrollableframe1.grid(row=1,column=1)

# hotel infra work


global table5
value5=gethotelinfra(username)
scrollableframe5=ctk.CTkScrollableFrame(tabview1.tab("Hotel
Infrastructure"),width=600)
scrollableframe5.grid(column=1,row=1)

table5=CTkTable(scrollableframe5,column=4,row=counthotelinfra(username)
+1,values=value5,hover_color="#3b3d3d")
table5.grid()

def addcompwindow():
global window4
window4=ctk.CTk()
window4.title("Add Component!")
window4.geometry("700x500")
global compentry,quantity,floor,menu

def addcomp():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
successmsg=ctk.CTkLabel(window4,text="Successfully
added!",text_color="green")
successmsg.grid(row=7,column=2)
statement=f"INSERT INTO hotel_infrastructure
(component_name,floor_number,quantity,purpose,username)
VALUES('{compentry.get()}','{floor.get()}',
{quantity.get()},'{menu.get()}','{realusername}');"
cur.execute(statement)
conn.commit()
conn.close()
compentry.delete(0,ctk.END)
quantity.delete(0,ctk.END)
floor.delete(0,ctk.END)
def removemsg():
successmsg.grid_forget()
successmsg.after(3000,removemsg)

compentry=ctk.CTkEntry(window4,placeholder_text="Component
Name:")
quantity=ctk.CTkEntry(window4,placeholder_text="Quantity:")
floor=ctk.CTkEntry(window4,placeholder_text="Floor:")

purposes=['Accommodation','Guest
Reception','Dining','Recreation','Relaxation','Transportation','Guest
Services','Business Services','Staff
Accommodation','Security','Safety','Facility Management']

purposelabel=ctk.CTkLabel(window4,text="Purpose:")

menu=ctk.CTkOptionMenu(window4,values=purposes,dynamic_resizing=True)
done2=ctk.CTkButton(window4,text="Add",fg_color="#f2fafa",hover_color="
#e1fafa",command=addcomp,text_color="black")

compentry.grid(column=2,row=2)
quantity.grid(column=2,row=3)
floor.grid(column=2,row=4)
purposelabel.grid(column=1,row=5,sticky="e")
menu.grid(column=2,row=5)
done2.grid(column=2,row=6)

window4.columnconfigure((1,2,3),weight=1)
window4.rowconfigure((1,2,3,4,5,6,7,8),weight=1)
window4.mainloop()

def removecompwindow():
global window5,centry
window5=ctk.CTk()
window5.title("Delete Components")
window5.geometry("500x500")

def search():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
global options
statement=f"SELECT component_name FROM hotel_infrastructure
WHERE component_name LIKE '%{centry.get()}%' AND
username='{realusername}';"
cur.execute(statement)
results=cur.fetchall()
conn.close()
l1=[]
for i in results:
l1.append(i[0])

options=ctk.CTkOptionMenu(window5,values=l1,dynamic_resizing=True)
options.grid(column=2,row=4)
def clear():
options.destroy()
clearbtn=ctk.CTkButton(window5,text="Clear",command=clear)
clearbtn.grid(column=2,row=5,sticky="N")

def delete():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"DELETE FROM hotel_infrastructure WHERE
component_name='{options.get()}' AND username='{realusername}'"
cur.execute(statement)
conn.commit()
conn.close()
successmsg=ctk.CTkLabel(window5,text="Deleted
successfully!",text_color="green")
successmsg.grid(column=2,row=7)
centry.delete(0,ctk.END)
def removemsg():
successmsg.grid_forget()
successmsg.after(3000,removemsg)

centry=ctk.CTkEntry(window5,placeholder_text="Search
component:")
searchbtn=ctk.CTkButton(window5,text="Search",command=search)

delbtn=ctk.CTkButton(window5,text="Delete",fg_color="#fc4454",hover_col
or="#fc2638",text_color="white",command=delete)

delbtn.grid(column=2,row=6)
centry.grid(column=2,row=2)
searchbtn.grid(column=2,row=3)
window5.rowconfigure((1,2,3,4,5,6,7,8,9),weight=1)
window5.columnconfigure((1,2,3),weight=1)
window5.mainloop()
def getrefreshhotelinfra():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT component_name,floor_number,quantity,purpose
FROM hotel_infrastructure WHERE username='{realusername}';"
cur.execute(statement)
result=cur.fetchall()
conn.close()
columns=[("Component","Quantity","Floor","Purpose")]
finalresult=columns+result
return finalresult

def countrefreshhotelinfra():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM hotel_infrastructure WHERE
username='{realusername}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

def refreshinfra():
global table5
table5.destroy()
value5=getrefreshhotelinfra()

table5=CTkTable(scrollableframe5,column=4,row=countrefreshhotelinfra()
+1,values=value5)
table5.grid()
# add/remove buttons
addinfrabtn=ctk.CTkButton(tabview1.tab("Hotel
Infrastructure"),text="Add Component",command=addcompwindow)
removeinfrabtn=ctk.CTkButton(tabview1.tab("Hotel
Infrastructure"),text="Remove
Component",fg_color="#fc4454",hover_color="#fc2638",text_color="white",
command=removecompwindow)
refreshinfrabtn=ctk.CTkButton(tabview1.tab("Hotel
Infrastructure"),text="Refresh",command=refreshinfra)
addinfrabtn.grid(column=0,row=1)
removeinfrabtn.grid(column=2,row=1)
refreshinfrabtn.grid(column=1,row=2)
# grids
tabview1.tab("Hotel
Infrastructure").columnconfigure((0,1,2),weight=1)

# employee work
def addemployeewindow():

def addemployee():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"INSERT INTO
hotel_employees(first_name,last_name,position,department,hire_date,sala
ry,username)
VALUES('{fname.get()}','{lname.get()}','{posn.get()}','{dept.get()}','{
hdate.get()}','{salary.get()}','{realusername}');"
cur.execute(statement)
conn.commit()
conn.close()
successmsg=ctk.CTkLabel(window6,text="Successfully
Added!",text_color="green")
successmsg.grid(row=7,column=2)
fname.delete(0,ctk.END)
lname.delete(0,ctk.END)
posn.delete(0,ctk.END)
dept.delete(0,ctk.END)
hdate.delete(0,ctk.END)
salary.delete(0,ctk.END)
def removemsg():
successmsg.grid_forget()
successmsg.after(3000,removemsg)

window6=ctk.CTk()
window6.title("Add Employee")
window6.geometry("700x700")
fname=ctk.CTkEntry(window6,placeholder_text="First name:")
lname=ctk.CTkEntry(window6,placeholder_text="Last name:")
posn=ctk.CTkEntry(window6,placeholder_text="Position:")
dept=ctk.CTkEntry(window6,placeholder_text="Department:")
hdate=ctk.CTkEntry(window6,placeholder_text="Hire date:")
salary=ctk.CTkEntry(window6,placeholder_text="Salary:")
addempbtn=ctk.CTkButton(window6,text="Add
Employee",command=addemployee)

addempbtn.grid(column=2,row=6)
fname.grid(column=2,row=2)
lname.grid(column=2,row=3,sticky='N')
posn.grid(column=2,row=3,sticky='S')
dept.grid(column=2,row=4)
hdate.grid(column=2,row=5,sticky='N')
salary.grid(column=2,row=5,sticky='S')

window6.rowconfigure((1,2,3,4,5,6,7,8,9),weight=1)
window6.columnconfigure((1,2,3),weight=1)

window6.mainloop()

def delemployeewindow():

def searchemp():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
global options3
statement=f"SELECT first_name,last_name FROM
hotel_employees WHERE first_name LIKE '%{ementry.get()}%' OR last_name
LIKE '%{ementry.get()}%';"
cur.execute(statement)
results=cur.fetchall()
conn.close()
l1=[]
for i in results:
l1.append(i[0]+" " +i[1])

options3=ctk.CTkOptionMenu(window7,values=l1,dynamic_resizing=True)
options3.grid(column=2,row=4)
def clear():
options3.destroy()
clearbtn=ctk.CTkButton(window7,text="Clear",command=clear)
clearbtn.grid(column=2,row=5)

def delemp():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
fullname=options3.get().split(" ")
first=fullname[0]
last=fullname[1]
statement=f"DELETE FROM hotel_employees WHERE
first_name='{first}' AND last_name='{last}' AND
username='{realusername}';"
cur.execute(statement)
conn.commit()
conn.close()
successmsg=ctk.CTkLabel(window7,text="Successfully
Deleted!",text_color="green")
successmsg.grid(column=2,row=7)
ementry.delete(0,ctk.END)
def clearmsg():
successmsg.destroy()
successmsg.after(3000,clearmsg)

window7=ctk.CTk()
window7.title("Remove Employee")
window7.geometry("400x400")

ementry=ctk.CTkEntry(window7,placeholder_text="Enter employee
name:")

searchbtn2=ctk.CTkButton(window7,text="Search
employee",command=searchemp)
delbtn2=ctk.CTkButton(window7,text="Delete",fg_color="#fc4454",hover_co
lor="#fc2638",text_color="white",command=delemp)

delbtn2.grid(column=2,row=6)
ementry.grid(column=2,row=2)
searchbtn2.grid(column=2,row=3)
window7.rowconfigure((1,2,3,4,5,6,7,8),weight=1)
window7.columnconfigure((1,2,3),weight=1)

window7.mainloop()

def getrefreshemployee():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT first_name, last_name, position, department,
hire_date, salary FROM hotel_employees WHERE
username='{realusername}';"
cur.execute(statement)
result=cur.fetchall()
conn.close()
columns=[("first_name", "last_name", "position", "department",
"hire_date", "salary")]
finalresult=columns+result
return finalresult

def getrefreshempcount():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM hotel_employees WHERE
username='{realusername}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

def refreshemployee():
global table4
table4.destroy()
value4=getrefreshemployee()

table4=CTkTable(scrollableframe4,column=6,row=getrefreshempcount()
+1,values=value4,hover_color="#121212")
table4.grid()
scrollableframe4=ctk.CTkScrollableFrame(tabview1.tab("Employees"),width
=870)
addempbtn=ctk.CTkButton(tabview1.tab("Employees"),text="Add
Employee",fg_color="#f2fafa",hover_color="#e1fafa",text_color="black",c
ommand=addemployeewindow)
removeempbtn=ctk.CTkButton(tabview1.tab("Employees"),text="Remove
Employee",fg_color="#fc4454",hover_color="#fc2638",command=delemployeew
indow)

refreshempbtn=ctk.CTkButton(tabview1.tab("Employees"),text="Refresh",co
mmand=refreshemployee)

tabview1.tab("Employees").rowconfigure((0,1,2),weight=1)
tabview1.tab("Employees").columnconfigure((0,1,2),weight=1)

refreshempbtn.grid(row=1,column=1)
addempbtn.grid(row=0,column=0)
removeempbtn.grid(row=0,column=2)
scrollableframe4.grid(row=0,column=1)
# employee table
global table4
value4=getemployee(username)
table4=CTkTable(scrollableframe4,column=6,row=getempcount(username)
+1,values=value4,hover_color="#121212")
table4.grid()

# financial work

scrollableframe3=ctk.CTkScrollableFrame(tabview1.tab("Financial"),width
=870)
scrollableframe3.grid(row=1,sticky=('WE'),column=2)
value3=getfinance(username)

# finance function
def addfinance():
financewindow=ctk.CTk()
financewindow.title("Add Financial Details")
financewindow.geometry("600x700")
financewindow.resizable(False,False)

global yearentry,reventry,expentry,netentry,adrentry,occupentry
yearentry=ctk.CTkEntry(financewindow,placeholder_text="Year:")
reventry=ctk.CTkEntry(financewindow,placeholder_text="Total
revenue:")
expentry=ctk.CTkEntry(financewindow,placeholder_text="Total
expenses:")
netentry=ctk.CTkEntry(financewindow,placeholder_text="Net
income")
adrentry=ctk.CTkEntry(financewindow,placeholder_text="ADR:")

occupentry=ctk.CTkEntry(financewindow,placeholder_text="Occupancy
rate:")

def savedatafin():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"INSERT INTO
financial(yearly,total_revenue,total_expenses,net_income,adr,occupancy_
rate,username) VALUES({yearentry.get()},{reventry.get()},
{expentry.get()},{netentry.get()},{adrentry.get()},
{occupentry.get()},'{realusername}');"
cur.execute(statement)
conn.commit()
conn.close()
yearentry.delete(0,ctk.END)
reventry.delete(0,ctk.END)
netentry.delete(0,ctk.END)
adrentry.delete(0,ctk.END)
occupentry.delete(0,ctk.END)
successmsg=ctk.CTkLabel(financewindow,text="Saved
Successfully",text_color="green")
successmsg.grid(row=8,column=2)
def clearmsg():
successmsg.destroy()
successmsg.after(3000,clearmsg)

savebtn=ctk.CTkButton(financewindow,text="Save",command=savedatafin)

savebtn.grid(row=7,column=2)
yearentry.grid(row=1,column=2)
reventry.grid(row=2,column=2)
expentry.grid(row=3,column=2)
netentry.grid(row=4,column=2)
adrentry.grid(row=5,column=2)
occupentry.grid(row=6,column=2)

financewindow.rowconfigure((1,2,3,4,5,6,7,8,9),weight=1)
financewindow.columnconfigure((1,2,3),weight=1)
financewindow.mainloop()
# add finance
addfinancebtn=ctk.CTkButton(tabview1.tab("Financial"),text="Add
Financial
Data",command=addfinance,fg_color="#f2fafa",hover_color="#e1fafa",text_
color="black")
addfinancebtn.grid(row=0,column=1,sticky=('E'))
def removefinance():
removefinwindow=ctk.CTk()
removefinwindow.title("Remove Financial Details")
removefinwindow.geometry("300x300")
removefinwindow.resizable(False,False)

def removefin():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"DELETE FROM financial WHERE
yearly={yearremove.get()} AND username='{realusername}';"
cur.execute(statement)
conn.commit()
conn.close()
successmsg=ctk.CTkLabel(removefinwindow,text="Deletion
successful!",text_color="green")
successmsg.grid(row=3,column=2)
yearremove.delete(0,ctk.END)
def clearmsg2():
successmsg.destroy()
successmsg.after(3000,clearmsg2)

global yearremove

yearremove=ctk.CTkEntry(removefinwindow,placeholder_text="Year:")

removeconfirmbtn=ctk.CTkButton(removefinwindow,text="Remove",command=re
movefin)

yearremove.grid(row=1,column=2)
removeconfirmbtn.grid(row=2,column=2)

removefinwindow.columnconfigure((1,2,3),weight=1)
removefinwindow.rowconfigure((1,2,3,4),weight=1)
removefinwindow.mainloop()

removefinancebtn=ctk.CTkButton(tabview1.tab("Financial"),text="Remove
Finance",command=removefinance,fg_color="#fc4454",hover_color="#fc2638"
)
removefinancebtn.grid(row=0,column=3)
# refresh finance functions
def getrefreshfinance():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT yearly, total_revenue, total_expenses,
net_income, adr, occupancy_rate FROM financial WHERE
username='{realusername}';"
cur.execute(statement)
result=cur.fetchall()
conn.close()
columns=[("yearly", "total_revenue", "total_expenses",
"net_income", "adr", "occupancy_rate")]
finalresult=columns+result
return finalresult

def financerefreshcount():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
statement=f"SELECT COUNT(*) FROM financial WHERE
username='{realusername}';"
cur.execute(statement)
result=cur.fetchone()[0]
conn.close()
return result

def refreshfinance():
global table3
table3.destroy()
value3=getrefreshfinance()

table3=CTkTable(scrollableframe3,column=6,row=financerefreshcount()
+1,values=value3,hover_color="#121212")
table3.grid()

refreshfinancebtn=ctk.CTkButton(tabview1.tab("Financial"),text="Refresh
",command=refreshfinance)
refreshfinancebtn.grid(row=0,column=2)

global table3

table3=CTkTable(scrollableframe3,column=6,row=financecount(username)
+1,values=value3,hover_color="#121212")
table3.grid()
tabview1.tab("Financial").columnconfigure((1,2,3),weight=1)
tabview1.tab("Financial").rowconfigure((0,1,2),weight=1)

# grid work
label1.grid(row=0)
greetlabel.grid(column=1,row=0)
tabview1.grid(column=1,row=1)
copyright2=ctk.CTkLabel(root2,text="Copyright© by S.Ray,T.Ray &
A.Chatterjee",text_color="grey",font=('Microsoft YaHei Light',10))
copyright2.grid(row=2,column=1,sticky=('SE'))
root2.columnconfigure((0,1,2),weight=1)
root2.mainloop()

# login page functions


def loginactivate():
login=ctk.CTk()
login.geometry("300x200")
login.title("Login")
# login.iconbitmap("hotel2.ico")
login.resizable(False,False)
def loginfinish():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
usnm=username.get()
pwd=password.get()
statement=f"SELECT pwd FROM userinfo WHERE usname='{usnm}';"
cur.execute(statement)
value=cur.fetchone()[0]
conn.close()
truepwd=value
if truepwd==pwd:
global realusername
realusername=usnm
login.destroy()
root.destroy()
maincontentlogin(realusername)
else:
wrongmsg=ctk.CTkLabel(login,text="Wrong password/username!
Please try again!",text_color="red")
wrongmsg.grid(row=3,column=1,pady=10)
# widgets
username=ctk.CTkEntry(login,placeholder_text="Username:")
password=ctk.CTkEntry(login,placeholder_text="Password")
loginbtn=ctk.CTkButton(login,command=loginfinish,text="Login")
login.columnconfigure(0,weight=1)
login.columnconfigure(1,weight=1)
login.columnconfigure(2,weight=1)
username.grid(row=0,column=1,pady=10)
password.grid(row=1,column=1,pady=10)
loginbtn.grid(row=2,column=1,pady=10)
login.mainloop()
def signupactivate():
signup=ctk.CTk()
signup.geometry("300x400")
signup.title("Sign Up")
signup.resizable(False,False)
# signup.iconbitmap("hotel2.ico")
def signupfinish():

conn=mysql.connector.connect(user='root',host='localhost',password='ass
sr2003$',port=3306,database='hoteldb')
cur=conn.cursor()
# entry into database
usnm=username.get()
pwd=password.get()
emid=emailid.get()
htname=hotelname.get()
available=availability(usnm)
if available==0:
# successmsg=ctk.CTkLabel(signup,text="Registration
Successful!\nWindow closes in 5 seconds!",text_color="green")
# successmsg.grid(row=6,column=1)
sql=f"INSERT INTO userinfo(usname,pwd,emailid,hotelname)
VALUES('{usnm}','{pwd}','{emid}','{htname}');"
cur.execute(sql)
conn.commit()
conn.close()
# destroy the window
signup.destroy()
else:
signuperrormsg=ctk.CTkLabel(signup,text="Username already
exists!",text_color="red")
signuperrormsg.grid(row=5,column=1)
# Entry widgets
username=ctk.CTkEntry(signup,placeholder_text="Username:")
password=ctk.CTkEntry(signup,placeholder_text="Password:")
emailid=ctk.CTkEntry(signup,placeholder_text="Email address:")
hotelname=ctk.CTkEntry(signup,placeholder_text="Hotel Name:")
donebtn=ctk.CTkButton(signup,command=signupfinish,text="Done")
# grid configurations
signup.columnconfigure(0,weight=1)
signup.columnconfigure(1,weight=1)
signup.columnconfigure(2,weight=1)
username.grid(row=0,column=1,pady=5)
password.grid(row=1,column=1,pady=5)
emailid.grid(row=2,column=1,pady=5)
hotelname.grid(row=3,column=1,pady=5)
donebtn.grid(row=4,column=1,pady=10)
signup.mainloop()

# login page
login_label=ctk.CTkLabel(root,text="Login/Sign
Up",font=('Helvetica',25,"bold"),fg_color="transparent")
greetings_label=ctk.CTkLabel(root,text="Welcome to Hosthub Hotel
Management Software. Enter your details to sign in!",font=('Roboto
Condensed',15,"italic"))
loginbtn=ctk.CTkButton(root,text="Login",command=loginactivate,font=('M
icrosoft YaHei UI',20,"bold"))
signupbtn=ctk.CTkButton(root,text="Sign
Up",command=signupactivate,font=('Microsoft YaHei UI',20,"bold"))

# copyright statement
copyright=ctk.CTkLabel(root,text="Copyright© by S.Ray,T.Ray &
A.Chatterjee",text_color="grey",font=('Microsoft YaHei Light',10))
copyright.grid(row=4,column=1,sticky=('SE'))
# grid configurations
root.columnconfigure(0,weight=1)
root.columnconfigure(1,weight=1)
root.columnconfigure(2,weight=1)
login_label.grid(row=0,column=1,pady=50,padx=50,ipadx=30,ipady=10,)
greetings_label.grid(row=1,column=1)
loginbtn.grid(row=2,column=1,pady=20)
signupbtn.grid(row=3,column=1)
root.rowconfigure(4,weight=2)

root.mainloop()

MySQL Database Design

You might also like