CODE :
from tkinter import *
from tkinter import messagebox
from tkcalendar import DateEntry # You need to install tkcalendar using: pip install tkcalendar
from datetime import date
import sqlite3
import random
import string
# Initialize main window
top = Tk()
top.geometry('550x300')
top.title('Ticket Booking System')
# Connect to the database
conn = sqlite3.connect('ticket_booking_database.db')
cursor = conn.cursor()
# Create table if it doesn't exist
cursor.execute("""
CREATE TABLE IF NOT EXISTS ticket (
name TEXT,
ticket_id TEXT PRIMARY KEY,
ticket_date TEXT,
ticket_validity TEXT
)
""")
# Fetch existing ticket IDs
cursor.execute('SELECT * FROM ticket')
tickets = cursor.fetchall()
tickets_id = [i[1] for i in tickets]
conn.commit()
# UI Header
Label(top, text='Ticket Management System', font=('Arial', 18)).grid(
row=0, column=0, columnspan=2, padx=80, pady=20
)
# Helper functions
def show_message(title, message):
messagebox.showinfo(title, message)
def get_random_string():
letters = string.ascii_lowercase
return ''.join(random.choice(letters) for _ in range(8))
def Book():
top1 = Toplevel()
top1.geometry('350x300')
top1.title('Book')
name = StringVar(top1)
ticket_id = StringVar(top1)
ticket_date = StringVar(top1)
ticket_date.set(date.today())
ticket_validity = StringVar(top1)
# Generate unique ticket ID
while True:
t_id = get_random_string()
if t_id not in tickets_id:
ticket_id.set(t_id)
break
def BookNow():
if len(name.get()) < 3 or len(ticket_date.get()) < 7 or len(ticket_validity.get()) < 7:
show_message('Error', 'Enter valid details')
return
try:
conn = sqlite3.connect("ticket_booking_database.db")
cursor = conn.cursor()
cursor.execute(
"INSERT INTO ticket (name, ticket_id, ticket_date, ticket_validity) VALUES (?, ?, ?, ?)",
(name.get(), ticket_id.get(), ticket_date.get(), ticket_validity.get())
)
conn.commit()
show_message('Successful', f'Booking successful!\nYour Ticket ID: {ticket_id.get()}')
top1.destroy()
except sqlite3.Error as e:
show_message('Error', str(e))
finally:
conn.close()
# Booking form layout
Label(top1, text='Enter details', font=('Arial', 14)).grid(row=0, column=0, padx=10, pady=10, columnspan=2)
Label(top1, text='Name', font=('Arial', 12)).grid(row=1, column=0, padx=10, pady=10, sticky='w')
Entry(top1, textvariable=name).grid(row=1, column=1)
Label(top1, text='Ticket ID', font=('Arial', 12)).grid(row=2, column=0, padx=10, pady=10, sticky='w')
Entry(top1, textvariable=ticket_id, state='disabled').grid(row=2, column=1)
Label(top1, text='Booking Date', font=('Arial', 12)).grid(row=3, column=0, padx=10, pady=10, sticky='w')
DateEntry(top1, selectmode='day', textvariable=ticket_date).grid(row=3, column=1)
Label(top1, text='Validity', font=('Arial', 12)).grid(row=4, column=0, padx=10, pady=10, sticky='w')
DateEntry(top1, selectmode='day', textvariable=ticket_validity).grid(row=4, column=1)
Button(top1, text='Confirm', bg='green', fg='white', font=('Arial', 14), width=10, command=BookNow).grid(row=5, column=1, pady=10)
def ViewHistory():
top2 = Toplevel()
top2.geometry('750x300')
top2.title('View Ticket Booking History')
headers = ['Customer Name', 'Ticket ID', 'Date of Booking', 'Ticket Validity(Date)']
for i, text in enumerate(headers):
Label(top2, text=text, font=('Arial', 12), borderwidth=1, relief="solid", width=20).grid(row=0, column=i, pady=10)
conn = sqlite3.connect('ticket_booking_database.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM ticket')
tickets = cursor.fetchall()
conn.close()
for i, ticket in enumerate(tickets):
for j, item in enumerate(ticket):
Label(top2, text=item, borderwidth=1, relief="solid", width=20).grid(row=i + 1, column=j)
def DeleteBooking():
top3 = Toplevel()
top3.geometry('800x300')
top3.title('Delete Ticket Booking')
headers = ['Customer Name', 'Ticket ID', 'Date of Booking', 'Ticket Validity(Date)', 'Action']
for i, text in enumerate(headers):
Label(top3, text=text, font=('Arial', 12), borderwidth=1, relief="solid", width=20).grid(row=0, column=i, pady=10)
def delete_rows(ticket_id):
try:
conn = sqlite3.connect("ticket_booking_database.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM ticket WHERE ticket_id = ?", (ticket_id,))
conn.commit()
show_message('Success', 'Ticket deleted successfully!')
top3.destroy()
DeleteBooking() # Refresh the window
except sqlite3.Error as e:
show_message('Error', str(e))
finally:
conn.close()
conn = sqlite3.connect('ticket_booking_database.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM ticket')
tickets = cursor.fetchall()
conn.close()
for i, ticket in enumerate(tickets):
for j, item in enumerate(ticket):
Label(top3, text=item, borderwidth=1, relief="solid", width=20).grid(row=i + 1, column=j)
Button(top3, text='Delete', command=lambda t_id=ticket[1]: delete_rows(t_id)).grid(row=i + 1, column=4)
# Main buttons
Button(top, text='Book Ticket', font=('Arial', 14), fg='white', width=12, height=2, bg='Green', command=Book).grid(row=1, column=0, padx=80, pady=20)
Button(top, text='View History', font=('Arial', 14), fg='white', width=12, height=2, bg='Green', command=ViewHistory).grid(row=1, column=1, pady=20)
Button(top, text='Delete Booking', font=('Arial', 14), fg='white', width=12, height=2, bg='Green', command=DeleteBooking).grid(row=2, column=0, pady=30)
Button(top, text='Quit', font=('Arial', 14), fg='white', width=12, height=2, bg='Green', command=top.destroy).grid(row=2, column=1, pady=30)
# Start the app
top.mainloop()
OUTPUT :
HOME PAGE :