0% found this document useful (0 votes)
5 views5 pages

Test 3

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views5 pages

Test 3

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

from tkinter import *

from tkinter import messagebox


import sqlite3
from tkinter import ttk
from tkcalendar import Calendar
import customtkinter as ctk

# Function to connect to the database


def connect_db():
return sqlite3.connect('railway_reservation.db')

# Main class for the Railway Reservation App


class RailwayReservationApp:
def __init__(self, root, username):
self.root = root
self.username = username
self.root.title("Railway Reservation System")
self.root.geometry("800x600")
self.create_main_menu()

def create_main_menu(self):
menu_frame = Frame(self.root, bg="white", padx=10, pady=10)
menu_frame.pack(fill=BOTH, expand=True)

ctk.CTkButton(menu_frame, text="View Ticket Details", corner_radius=20,


command=self.view_tickets).pack(pady=10)
ctk.CTkButton(menu_frame, text="Book Tickets", corner_radius=20,
command=self.book_tickets).pack(pady=10)
ctk.CTkButton(menu_frame, text="Search Trains", corner_radius=20,
command=self.search_trains).pack(pady=10)

def view_tickets(self):
view_window = Toplevel(self.root)
view_window.title("View Tickets")
view_window.geometry("900x400")

conn = connect_db()
cursor = conn.cursor()
cursor.execute('SELECT * FROM Bookings WHERE Username=?', (self.username,))
bookings = cursor.fetchall()
conn.close()

columns = ("BookingID", "TrainNo", "Date", "PassengerName", "PassengerAge",


"PassengerGender", "BerthPreference")
tree = ttk.Treeview(view_window, columns=columns, show='headings')

# Set fixed column widths, adjust as necessary


column_widths = [80, 100, 100, 120, 80, 100, 150]
for col, width in zip(columns, column_widths):
tree.heading(col, text=col)
tree.column(col, width=width, anchor='center')
tree.pack(fill=BOTH, expand=True)

for booking in bookings:


# Ensure each booking detail fits in the corresponding column
tree.insert('', END, values=booking)

def book_tickets(self):
self.booking_window = Toplevel(self.root)
self.booking_window.title("Book Tickets")
self.booking_window.geometry("600x600")

Label(self.booking_window, text="Select Date:").grid(row=0, column=0,


padx=10, pady=10)
self.date_var = StringVar()
self.date_entry = Entry(self.booking_window, textvariable=self.date_var)
self.date_entry.grid(row=0, column=1, padx=10, pady=10)
self.calendar_btn = ctk.CTkButton(self.booking_window, text="Select Date",
corner_radius=20, command=self.select_date)
self.calendar_btn.grid(row=0, column=2, padx=10, pady=10)

Label(self.booking_window, text="Starting Station:").grid(row=1, column=0,


padx=10, pady=10)
self.start_station = Entry(self.booking_window)
self.start_station.grid(row=1, column=1, padx=10, pady=10)

Label(self.booking_window, text="Destination Station:").grid(row=2,


column=0, padx=10, pady=10)
self.destination_station = Entry(self.booking_window)
self.destination_station.grid(row=2, column=1, padx=10, pady=10)

self.search_trains_button = ctk.CTkButton(self.booking_window, text="Search


Trains", corner_radius=20, command=self.search_available_trains)
self.search_trains_button.grid(row=3, column=0, columnspan=3, pady=10)

Label(self.booking_window, text="Select Train:").grid(row=4, column=0,


padx=10, pady=10)
self.selected_train = StringVar()
self.train_menu = ttk.Combobox(self.booking_window,
textvariable=self.selected_train, state="readonly")
self.train_menu.grid(row=4, column=1, padx=10, pady=10)

Label(self.booking_window, text="Number of Passengers:").grid(row=5,


column=0, padx=10, pady=10)
self.passenger_count = Spinbox(self.booking_window, from_=1, to=10,
command=self.add_passenger_fields)
self.passenger_count.grid(row=5, column=1, padx=10, pady=10)

self.passenger_details_frame = Frame(self.booking_window)
self.passenger_details_frame.grid(row=6, column=0, columnspan=3)

self.passenger_entries = []
self.add_passenger_fields()

self.book_button = ctk.CTkButton(self.booking_window, text="Proceed",


corner_radius=20, command=self.show_booking_summary)
self.book_button.grid(row=7, column=0, columnspan=3, pady=10)

def search_trains(self):
search_window = Toplevel(self.root)
search_window.title("Search Trains")
search_window.geometry("600x400")

Label(search_window, text="Starting Station:").grid(row=0, column=0,


padx=10, pady=10)
start_station = Entry(search_window)
start_station.grid(row=0, column=1, padx=10, pady=10)
Label(search_window, text="Destination Station:").grid(row=1, column=0,
padx=10, pady=10)
destination_station = Entry(search_window)
destination_station.grid(row=1, column=1, padx=10, pady=10)

search_button = ctk.CTkButton(search_window, text="Search",


corner_radius=20, command=lambda: self.search_results(search_window,
start_station.get(), destination_station.get()))
search_button.grid(row=2, column=0, columnspan=2, pady=10)

def search_results(self, search_window, start, destination):


conn = connect_db()
cursor = conn.cursor()
cursor.execute('SELECT TrainNo, TrainName FROM Trains WHERE
StartingStation=? AND Destination=?', (start, destination))
trains = cursor.fetchall()
conn.close()

result_frame = Frame(search_window)
result_frame.grid(row=3, column=0, columnspan=2, padx=10, pady=10)
for train in trains:
Label(result_frame, text=f"Train No: {train[0]}, Train Name:
{train[1]}").pack()

def search_available_trains(self):
start_station = self.start_station.get()
destination_station = self.destination_station.get()
travel_date = self.date_var.get()

# Validate user inputs


if not start_station or not destination_station or not travel_date:
messagebox.showwarning("Input Error", "All fields are required")
return

# Connect to the database and fetch available trains


conn = connect_db()
cursor = conn.cursor()

cursor.execute('''
SELECT TrainName, TrainNo, StartingStation, Destination, StartingTime,
ReachingTime
FROM Trains
WHERE StartingStation = ? AND Destination = ?
''', (start_station, destination_station))

trains = cursor.fetchall()
conn.close()

# Display the trains in the combobox


if not trains:
messagebox.showinfo("No Trains", "No trains found for the selected
route and date.")
return

train_names = [f"{train[0]} ({train[1]})" for train in trains]


self.train_menu['values'] = train_names
self.train_menu.current(0) # Set default selection to the first train

def add_passenger_fields(self):
for widget in self.passenger_details_frame.winfo_children():
widget.destroy()

labels = ["Name", "Age", "Gender", "Berth Preference"]


for i, text in enumerate(labels):
Label(self.passenger_details_frame, text=text).grid(row=0, column=i,
padx=10, pady=5)

self.passenger_entries = []
for i in range(int(self.passenger_count.get())):
row = []
for j in range(4):
if j == 2: # Gender
gender_var = StringVar()
gender_menu = ttk.Combobox(self.passenger_details_frame,
textvariable=gender_var, values=["Male", "Female", "Other"], state='readonly')
gender_menu.grid(row=i + 1, column=j, padx=10, pady=5)
row.append(gender_menu)
elif j == 3: # Berth Preference
berth_var = StringVar()
berth_menu = ttk.Combobox(self.passenger_details_frame,
textvariable=berth_var, values=["Lower", "Middle", "Upper", "Side Lower", "Side
Upper"], state='readonly')
berth_menu.grid(row=i + 1, column=j, padx=10, pady=5)
row.append(berth_menu)
else:
entry = Entry(self.passenger_details_frame)
entry.grid(row=i + 1, column=j, padx=10, pady=5)
row.append(entry)
self.passenger_entries.append(row)

def show_booking_summary(self):
# Gather all data
train_no = self.selected_train.get()
travel_date = self.date_var.get()
passenger_data = []
for row in self.passenger_entries:
name = row[0].get()
age = row[1].get()
gender = row[2].get()
berth_pref = row[3].get()
passenger_data.append((name, age, gender, berth_pref))

# Here, implement the logic to show the booking summary and confirm booking
summary_window = Toplevel(self.root)
summary_window.title("Booking Summary")
summary_window.geometry("400x400")

Label(summary_window, text=f"Train No: {train_no}").pack()


Label(summary_window, text=f"Date of Travel: {travel_date}").pack()
Label(summary_window, text="Passenger Details:").pack()

for passenger in passenger_data:


Label(summary_window, text=f"Name: {passenger[0]}, Age: {passenger[1]},
Gender: {passenger[2]}, Berth: {passenger[3]}").pack()

Button(summary_window, text="Confirm Booking", command=lambda:


self.confirm_booking(train_no, travel_date, passenger_data)).pack()
def confirm_booking(self, train_no, travel_date, passenger_data):
conn = connect_db()
cursor = conn.cursor()

for passenger in passenger_data:


cursor.execute('INSERT INTO Bookings (Username, TrainNo, Date,
PassengerName, PassengerAge, PassengerGender, BerthPreference) VALUES
(?, ?, ?, ?, ?, ?, ?)',
(self.username, train_no, travel_date, passenger[0],
passenger[1], passenger[2], passenger[3]))

conn.commit()
conn.close()

messagebox.showinfo("Booking Confirmed", "Your booking has been


confirmed!")
self.booking_window.destroy()

def select_date(self):
def on_date_selected():
self.date_var.set(cal.get_date())
cal_window.destroy()

cal_window = Toplevel(self.booking_window)
cal_window.title("Select Date")
cal = Calendar(cal_window, selectmode='day')
cal.pack(pady=20)
Button(cal_window, text="Select", command=lambda:
on_date_selected()).pack(pady=10)

if __name__ == "__main__":
root = ctk.CTk()
app = RailwayReservationApp(root, username="user123")
root.mainloop()

You might also like