import mysql.
connector as c
import customtkinter as ctk
from tkinter import messagebox
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import os
# Cost per kilometer
COST_PER_KM = 4
# Function to create a database connection
def create_database_connection():
try:
connection = c.connect(
host="localhost", # Your MySQL host
user="root", # Your MySQL username
password="your_password", # Replace with your password
database="airline_reservation" # Database name
return connection
except c.Error as err:
print(f"Error: {err}")
return None
# Function to create flights table
def create_flights_table():
conn = create_database_connection()
if conn is None:
return
cursor = conn.cursor()
# Create flights table if not exists
cursor.execute('''CREATE TABLE IF NOT EXISTS flights (
flight_id INT AUTO_INCREMENT PRIMARY KEY,
flight_number VARCHAR(10),
origin VARCHAR(100),
destination VARCHAR(100),
departure_time DATETIME,
available_seats INT,
distance INT)''')
# Insert sample flights if the table is empty
cursor.execute("SELECT COUNT(*) FROM flights")
if cursor.fetchone()[0] == 0:
cursor.execute("INSERT INTO flights (flight_number, origin, destination, departure_time,
available_seats, distance) VALUES (%s, %s, %s, %s, %s, %s)",
('AA123', 'New York', 'Los Angeles', '2024-12-15 14:00:00', 50, 4000))
cursor.execute("INSERT INTO flights (flight_number, origin, destination, departure_time,
available_seats, distance) VALUES (%s, %s, %s, %s, %s, %s)",
('BB456', 'Chicago', 'Miami', '2024-12-16 09:00:00', 30, 2000))
conn.commit()
conn.close()
# Function to calculate total cost
def calculate_total_cost():
try:
num_passengers = int(passengers_entry.get())
flight_id = selected_flight_id
conn = create_database_connection()
cursor = conn.cursor()
cursor.execute("SELECT distance FROM flights WHERE flight_id=%s", (flight_id,))
distance = cursor.fetchone()[0]
total_cost = num_passengers * distance * COST_PER_KM
total_cost_label.config(text=f"Total Cost: ₹{total_cost}")
conn.close()
return total_cost
except Exception as e:
total_cost_label.config(text="Error calculating cost.")
print(e)
return 0
# Function to generate the PDF ticket
def generate_ticket_pdf(passenger_name, num_passengers, flight_details, total_cost):
flight_number, origin, destination, departure_time = flight_details
filename = f"{passenger_name}_ticket.pdf"
c = canvas.Canvas(filename, pagesize=letter)
c.drawString(100, 750, f"Ticket for {passenger_name}")
c.drawString(100, 730, f"Flight Number: {flight_number}")
c.drawString(100, 710, f"Origin: {origin}")
c.drawString(100, 690, f"Destination: {destination}")
c.drawString(100, 670, f"Departure Time: {departure_time}")
c.drawString(100, 650, f"Number of Passengers: {num_passengers}")
c.drawString(100, 630, f"Total Cost: ₹{total_cost}")
c.save()
messagebox.showinfo("Ticket Generated", f"Your ticket has been downloaded as {filename}")
# Function to book a flight
def book_flight():
passenger_name = passenger_name_entry.get()
num_passengers = int(passengers_entry.get())
conn = create_database_connection()
if conn is None:
return
cursor = conn.cursor()
# Fetch selected flight details
cursor.execute("SELECT flight_number, origin, destination, departure_time FROM flights WHERE
flight_id=%s", (selected_flight_id,))
flight_details = cursor.fetchone()
flight_number, origin, destination, departure_time = flight_details
# Insert reservation into database
cursor.execute("INSERT INTO reservations (flight_id, passenger_name) VALUES (%s, %s)",
(selected_flight_id, passenger_name))
conn.commit()
total_cost = calculate_total_cost()
generate_ticket_pdf(passenger_name, num_passengers, flight_details, total_cost) # Generate and
download the ticket
messagebox.showinfo("Booking Confirmed", f"Your flight has been booked!\nTotal Cost:
₹{total_cost}")
conn.close()
# Function to search for flights based on origin and destination
def search_available_flights():
origin = origin_entry.get()
destination = destination_entry.get()
conn = create_database_connection()
if conn is None:
return
cursor = conn.cursor()
cursor.execute("SELECT * FROM flights WHERE origin=%s AND destination=%s", (origin, destination))
available_flights = cursor.fetchall()
# Clear previous search results
for widget in results_frame.winfo_children():
widget.destroy()
if available_flights:
for flight in available_flights:
flight_id = flight[0]
flight_number = flight[1]
departure_time = flight[4]
available_seats = flight[5]
ctk.CTkLabel(results_frame, text=f"Flight {flight_number} | {departure_time} | Available Seats:
{available_seats}", anchor="w").pack()
ctk.CTkButton(results_frame, text="Select", command=lambda flight_id=flight_id:
select_flight(flight_id)).pack()
else:
ctk.CTkLabel(results_frame, text="No flights found for this route.", anchor="w").pack()
conn.close()
# Function to select a flight for booking
def select_flight(flight_id):
global selected_flight_id
selected_flight_id = flight_id
calculate_total_cost()
# Create the main window
ctk.set_appearance_mode("Dark")
ctk.set_default_color_theme("blue")
root = ctk.CTk()
root.title("Airline Reservation System")
# Search for flights
search_frame = ctk.CTkFrame(root)
search_frame.pack(padx=20, pady=20)
ctk.CTkLabel(search_frame, text="Enter Origin:").grid(row=0, column=0, padx=10, pady=10)
origin_entry = ctk.CTkEntry(search_frame)
origin_entry.grid(row=0, column=1)
ctk.CTkLabel(search_frame, text="Enter Destination:").grid(row=1, column=0, padx=10, pady=10)
destination_entry = ctk.CTkEntry(search_frame)
destination_entry.grid(row=1, column=1)
ctk.CTkButton(search_frame, text="Search Flights", command=search_available_flights).grid(row=2,
columnspan=2, pady=20)
# Results frame to display flight options
results_frame = ctk.CTkFrame(root)
results_frame.pack(padx=20, pady=20)
# Booking details
booking_frame = ctk.CTkFrame(root)
booking_frame.pack(padx=20, pady=20)
ctk.CTkLabel(booking_frame, text="Passenger Name:").grid(row=0, column=0, padx=10, pady=10)
passenger_name_entry = ctk.CTkEntry(booking_frame)
passenger_name_entry.grid(row=0, column=1)
ctk.CTkLabel(booking_frame, text="No. of Passengers:").grid(row=1, column=0, padx=10, pady=10)
passengers_entry = ctk.CTkEntry(booking_frame)
passengers_entry.grid(row=1, column=1)
total_cost_label = ctk.CTkLabel(booking_frame, text="Total Cost: ₹0")
total_cost_label.grid(row=2, columnspan=2, pady=10)
ctk.CTkButton(booking_frame, text="Book Flight", command=book_flight).grid(row=3, columnspan=2,
pady=20)
# Set up the flights table and sample data
create_flights_table()
root.mainloop()