0% found this document useful (0 votes)
9 views

computer project class 12

Uploaded by

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

computer project class 12

Uploaded by

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

import tkinter as tk

from tkinter import messagebox

import csv

import random

import string

import os

def generate_rr_number():

"""Generates a unique RR number using random letters and numbers."""

return ''.join(random.choices(string.ascii_uppercase + string.digits, k=8))

# Function for the first page

def first_page():

root = tk.Tk()

root.title("Electricity Bill Generator")

root.geometry("600x400")

root.configure(bg="light pink")

# Title for the first page

title_label = tk.Label(root, text="Electricity Bill Generator", font=("Times New Roman", 24, "bold"),
bg="light pink")

title_label.pack(pady=20)

# Buttons for navigation

register_button = tk.Button(root, text="REGISTER", font=("Times New Roman", 24), bg="white",


command=register_page)

register_button.pack(pady=10)

login_button = tk.Button(root, text="LOGIN", font=("Times New Roman", 24), bg="white",


command=login_page)

login_button.pack(pady=10)
rate_button = tk.Button(root, text="CURRENT ELECTRICITY RATE", font=("Times New Roman", 24),
bg="white", command=check_rate_page)

rate_button.pack(pady=10)

admin_button = tk.Button(root, text="ADMIN LOGIN", font=("Times New Roman", 24), bg="white",


command=admin_login_page)

admin_button.pack(pady=10)

close_button = tk.Button(root, text="CLOSE APPLICATION", font=("Times New Roman", 24),


bg="white", command=root.destroy)

close_button.pack(pady=25)

root.mainloop()

# Function for the "Check Current Electricity Rate" page

def check_rate_page():

rate_window = tk.Toplevel()

rate_window.title("Current Electricity Rates")

rate_window.geometry("600x400")

rate_window.configure(bg="light pink")

title_label = tk.Label(rate_window, text="Electricity Rates", font=("Times New Roman", 24, "bold"),


bg="light pink")

title_label.grid(row=0, column=0, columnspan=2, pady=10)

# Updated electricity rate table with only two columns

table_data = [

["Fixed Charges", ""],

["For the first KW", "Rs.40.00"],

["For every additional KW", "Rs.50.00"],

["Variable Charges", ""],

["Slab 1 (0-30 Units)", "Rs.3.25/Unit"],


["Slab 2 (31-100 Units)", "Rs.4.70/Unit"],

["Slab 3 (101-200 Units)", "Rs.6.25/Unit"],

["Slab 4 (201-300 Units)", "Rs.7.30/Unit"],

["Slab 5 (301-400 Units)", "Rs.7.35/Unit"],

["Slab 6 (Above 400 Units)", "Rs.7.40/Unit"]

for row_index, row in enumerate(table_data):

for col_index, cell in enumerate(row):

label = tk.Label(rate_window, text=cell, font=("Times New Roman", 16), bg="light pink",


borderwidth=1, relief="solid", padx=10, pady=5)

label.grid(row=row_index + 1, column=col_index, sticky="nsew")

back_button = tk.Button(rate_window, text="Back", font=("Times New Roman", 16), bg="white",


command=rate_window.destroy)

back_button.grid(row=len(table_data) + 2, column=0, columnspan=2, pady=10)

for col in range(2):

rate_window.grid_columnconfigure(col, weight=1)

# Register Page

def register_page():

global entries, connection_type, tariff_type, register_window

register_window = tk.Toplevel()

register_window.title("REGISTER")

register_window.geometry("600x600")

register_window.configure(bg="light pink")

title_label = tk.Label(register_window, text="REGISTER", font=("Times New Roman", 24, "bold"),


bg="light pink")

title_label.grid(row=0, column=0, columnspan=2, pady=20)


labels = [

"Full Name", "Date of Birth", "Mobile Number", "Email Address",

"Username", "Password", "Confirm Password", "House Number/Building Name",

"Area/Street", "Country", "State", "Pin Code"

entries = {}

for i, label_text in enumerate(labels):

label = tk.Label(register_window, text=label_text, font=("Times New Roman", 16), bg="light


pink")

label.grid(row=i+1, column=0, padx=10, pady=5, sticky="w")

entry = tk.Entry(register_window, font=("Times New Roman", 16))

entry.grid(row=i+1, column=1, padx=10, pady=5, sticky="ew") # Align entry to the width

entries[label_text] = entry

# Center-aligned dropdown for Connection Type

connection_label = tk.Label(register_window, text="Connection Type", font=("Times New Roman",


16), bg="light pink")

connection_label.grid(row=13, column=0, padx=10, pady=5, sticky="w")

connection_type = tk.StringVar(register_window)

connection_dropdown = tk.OptionMenu(register_window, connection_type, "RESIDENTIAL",


"COMMERCIAL", "INDUSTRIAL")

connection_dropdown.config(font=("Times New Roman", 16))

connection_dropdown.grid(row=13, column=1, padx=10, pady=5, sticky="ew")

# Center-aligned dropdown for Tariff Type

tariff_label = tk.Label(register_window, text="Tariff Type", font=("Times New Roman", 16),


bg="light pink")

tariff_label.grid(row=14, column=0, padx=10, pady=5, sticky="w")


tariff_type = tk.StringVar(register_window)

tariff_dropdown = tk.OptionMenu(register_window, tariff_type, "URBAN", "RURAL")

tariff_dropdown.config(font=("Times New Roman", 16))

tariff_dropdown.grid(row=14, column=1, padx=10, pady=5, sticky="ew")

submit_button = tk.Button(register_window, text="SUBMIT", font=("Times New Roman", 16),


bg="white", command=submit_registration)

submit_button.grid(row=15, column=0, columnspan=2, pady=20)

for col in range(2):

register_window.grid_columnconfigure(col, weight=1) # Center align columns

# Registration Success Popup Function

def registration_success_popup():

popup = tk.Toplevel()

popup.title("Registration Successful")

popup.geometry("400x200")

popup.configure(bg="light pink")

# Success message label

success_label = tk.Label(popup, text="REGISTRATION SUCCESSFUL.", font=("Times New Roman",


18, "bold"), bg="light pink")

success_label.pack(pady=20)

# Define the go_to_login function

def go_to_login():

popup.destroy()

first_page()

# Go back button to redirect to the login page

go_back_button = tk.Button(popup, text="GO BACK TO LOGIN PAGE", font=("Times New Roman",


14), bg="white", command=go_to_login)
go_back_button.pack(pady=10)

# Submit Registration Function

def submit_registration():

# Check if all fields are filled

for field, entry in entries.items():

if not entry.get():

messagebox.showerror("Error", f"Please enter {field}")

return

# Check if passwords match

if entries["Password"].get() != entries["Confirm Password"].get():

messagebox.showerror("Error", "Passwords do not match")

return

# Generate a unique RR Number

rr_number = generate_rr_number()

# Collect user data, including the RR Number

user_data = [

entries["Full Name"].get(),

entries["Date of Birth"].get(),

entries["Mobile Number"].get(),

entries["Email Address"].get(),

entries["Username"].get(),

entries["Password"].get(),

entries["House Number/Building Name"].get(),

entries["Area/Street"].get(),

entries["Country"].get(),

entries["State"].get(),

entries["Pin Code"].get(),
connection_type.get(),

tariff_type.get(),

rr_number

# Write data to CSV

with open("users.csv", mode="a", newline='') as file:

writer = csv.writer(file)

writer.writerow(user_data)

registration_success_popup()

# LOGIN PAGE FUNCTION (With corrections)

def login_page():

login_window = tk.Toplevel()

login_window.title("Login Page")

login_window.geometry("600x400")

login_window.configure(bg="light pink")

# Login page title

title_label = tk.Label(login_window, text="Login Page", font=("Times New Roman", 32, "bold"),


bg="light pink")

title_label.pack(pady=20)

# Username and Password fields

username_label = tk.Label(login_window, text="Username", font=("Times New Roman", 32),


bg="light pink")

username_label.pack(pady=5)

username_entry = tk.Entry(login_window, font=("Times New Roman",32))

username_entry.pack(pady=5)

password_label = tk.Label(login_window, text="Password", font=("Times New Roman",32),


bg="light pink")
password_label.pack(pady=5)

password_entry = tk.Entry(login_window, show="*", font=("Times New Roman", 32))

password_entry.pack(pady=5)

# Validate Login Button

login_button = tk.Button(login_window, text="Login", font=("Times New Roman", 32), bg="white",


command=lambda: validate_login(username_entry.get(), password_entry.get(), login_window))

login_button.pack(pady=20)

login_window.mainloop()

# Validate Login Function

def validate_login(username, password, login_window):

with open("users.csv", mode="r") as file:

reader = csv.reader(file)

for row in reader:

if row[4] == username and row[5] == password:

user_full_name = row[0]

rr_number = row[-1] # Assuming RR number is the last element

messagebox.showinfo("Success", "Login successful!")

login_window.destroy()

user_page(user_full_name, rr_number, username) # Pass username here

return

messagebox.showerror("Error", "Invalid username or password")

# USER PAGE FUNCTION

def user_page(user_full_name, rr_number, username):

user_window = tk.Toplevel()

user_window.title("User Page")

user_window.geometry("600x400")

user_window.configure(bg="light pink")
welcome_label = tk.Label(user_window, text=f"WELCOME, {user_full_name}", font=("Times New
Roman", 25), bg="light pink")

welcome_label.pack(pady=25)

# Buttons to navigate to other pages

view_bills_button = tk.Button(user_window, text="VIEW YOUR BILLS", font=("Times New Roman",


24), bg="white", command= view_bills)

view_bills_button.pack(pady=25)

view_profile_button = tk.Button(user_window, text="VIEW PROFILE", font=("Times New Roman",


24), bg="white", command=lambda: view_profile_page(user_full_name, username))

view_profile_button.pack(pady=25)

edit_button = tk.Button(user_window, text="EDIT ACCOUNT DETAILS", font=("Times New Roman",


24), bg="white", command=lambda: edit_account_details(username))

edit_button.pack(pady=25)

change_password_button = tk.Button(user_window, text="CHANGE YOUR PASSWORD",


font=("Times New Roman", 24), bg="white", command=change_password_page)

change_password_button.pack(pady=25)

delete_account_button = tk.Button(user_window, text="DELETE ACCOUNT", font=("Times New


Roman", 24), bg="white", command=lambda: delete_account_page(username))

delete_account_button.pack(pady=25)

logout_button = tk.Button(user_window, text="LOGOUT", font=("Times New Roman", 24),


bg="white", command=user_window.destroy)

logout_button.pack(pady=25)

user_window.mainloop()

# View Profile Page Function


def view_profile_page(user_full_name, username):

profile_window = tk.Toplevel()

profile_window.title("View Profile")

profile_window.geometry("600x600")

profile_window.configure(bg="light pink")

# Profile Title

title_label = tk.Label(profile_window, text="User Profile", font=("Times New Roman", 24, "bold"),


bg="light pink")

title_label.pack(pady=20)

# Retrieve User Details from CSV

try:

with open("users.csv", mode="r") as file:

reader = csv.reader(file)

for row in reader:

if row[4] == username: # Match by username

profile_data = {

"Full Name": row[0],

"Date of Birth": row[1],

"Mobile Number": row[2],

"Email Address": row[3],

"Username": row[4],

"Password": row[5],

"Confirm Password": row[5], # Passwords are the same in this app

"House Number/Building Name": row[6],

"Area/Street": row[7],

"Country": row[8],

"State": row[9],

"Pin Code": row[10],

"Connection Type": row[11],


"Tariff Type": row[12],

"RR Number": row[13]

break

else:

messagebox.showerror("Error", "User details not found!")

profile_window.destroy()

return

except FileNotFoundError:

messagebox.showerror("Error", "User data file not found!")

profile_window.destroy()

return

# Display User Details

for key, value in profile_data.items():

frame = tk.Frame(profile_window, bg="light pink")

frame.pack(fill="x", padx=20, pady=5)

label_key = tk.Label(frame, text=f"{key}:", font=("Times New Roman", 16, "bold"), bg="light


pink", anchor="w")

label_key.pack(side="left", fill="x")

label_value = tk.Label(frame, text=value, font=("Times New Roman", 16), bg="light pink",


anchor="w")

label_value.pack(side="left", fill="x")

# Back to User Page Button

back_button = tk.Button(profile_window, text="GO BACK TO USER'S PAGE", font=("Times New


Roman", 16), bg="white", command=profile_window.destroy)

back_button.pack(pady=20)

def edit_account_details(username):
# Open the CSV file and find the user's data

user_data = None

rows = []

with open("users.csv", mode="r") as file:

reader = csv.reader(file)

for row in reader:

rows.append(row)

if row[4] == username: # Assuming the 5th column stores the username

user_data = row

if not user_data:

messagebox.showerror("Error", "User data not found!")

return

# Create the Edit Details window

edit_window = tk.Toplevel()

edit_window.title("Edit Account Details")

edit_window.geometry("600x600")

edit_window.configure(bg="light pink")

title_label = tk.Label(edit_window, text="EDIT YOUR ACCOUNT DETAILS", font=("Times New


Roman", 20, "bold"), bg="light pink")

title_label.pack(pady=20)

# Define the fields to edit

fields_to_edit = {

"Full Name": 0,

"Mobile Number": 2,

"Email Address": 3,

"House Number/Building Name": 6,

"Area/Street": 7,
"Country": 8,

"State": 9,

"Pin Code": 10,

entries = {}

for i, (label_text, index) in enumerate(fields_to_edit.items()):

label = tk.Label(edit_window, text=label_text, font=("Times New Roman", 16), bg="light pink")

label.pack(pady=5)

entry = tk.Entry(edit_window, font=("Times New Roman", 16))

entry.insert(0, user_data[index]) # Pre-fill with existing data

entry.pack(pady=5)

entries[label_text] = entry

# Save changes function

def save_changes():

updated_data = user_data.copy()

for field, entry in entries.items():

if entry.get(): # Update only if the field is not empty

updated_data[fields_to_edit[field]] = entry.get()

# Update the CSV file with the new details

with open("users.csv", mode="w", newline='') as file:

writer = csv.writer(file)

for row in rows:

if row[4] == username:

writer.writerow(updated_data) # Write updated data

else:

writer.writerow(row)
messagebox.showinfo("Success", "Account details updated successfully!")

edit_window.destroy()

# Save Changes button

save_button = tk.Button(edit_window, text="SAVE CHANGES", font=("Times New Roman", 12),


bg="white", command=save_changes)

save_button.pack(pady=20)

# Close the Edit Details window

def close_edit_window():

edit_window.destroy()

close_button = tk.Button(edit_window, text="CANCEL", font=("Times New Roman", 12),


bg="white", command=close_edit_window)

close_button.pack(pady=10)

def change_password_page():

# Create the Change Password window

change_password_window = tk.Toplevel()

change_password_window.title("Change Password")

change_password_window.geometry("600x400")

change_password_window.configure(bg="light pink")

title_label = tk.Label(change_password_window, text="CHANGE PASSWORD", font=("Times New


Roman", 24, "bold"), bg="light pink")

title_label.pack(pady=20)

# Username

username_label = tk.Label(change_password_window, text="Username", font=("Times New


Roman", 16), bg="light pink")

username_label.pack(pady=5)
username_entry = tk.Entry(change_password_window, font=("Times New Roman", 16))

username_entry.pack(pady=5)

# New Password

new_password_label = tk.Label(change_password_window, text="New Password", font=("Times


New Roman", 16), bg="light pink")

new_password_label.pack(pady=5)

new_password_entry = tk.Entry(change_password_window, show="*", font=("Times New Roman",


16))

new_password_entry.pack(pady=5)

# Confirm New Password

confirm_password_label = tk.Label(change_password_window, text="Confirm New Password",


font=("Times New Roman", 16), bg="light pink")

confirm_password_label.pack(pady=5)

confirm_password_entry = tk.Entry(change_password_window, show="*", font=("Times New


Roman", 16))

confirm_password_entry.pack(pady=5)

# Function to save the new password

def save_new_password():

username = username_entry.get()

new_password = new_password_entry.get()

confirm_password = confirm_password_entry.get()

if not username or not new_password or not confirm_password:

messagebox.showerror("Error", "All fields are required!")

return

if new_password != confirm_password:

messagebox.showerror("Error", "Passwords do not match!")

return
user_found = False

rows = []

# Check and update the password in the CSV

with open("users.csv", mode="r") as file:

reader = csv.reader(file)

for row in reader:

if row[4] == username: # Assuming username is in the 5th column

user_found = True

row[5] = new_password # Assuming password is in the 6th column

rows.append(row)

if user_found:

with open("users.csv", mode="w", newline='') as file:

writer = csv.writer(file)

writer.writerows(rows)

messagebox.showinfo("Success", "Password changed successfully!")

change_password_window.destroy()

else:

messagebox.showerror("Error", "Username not found! Please try again.")

# Save Changes button

save_button = tk.Button(change_password_window, text="SUBMIT", font=("Times New Roman",


16), bg="white", command=save_new_password)

save_button.pack(pady=20)

# Close the Change Password window

def close_change_password_window():

change_password_window.destroy()
cancel_button = tk.Button(change_password_window, text="CANCEL", font=("Times New Roman",
16), bg="white", command=close_change_password_window)

cancel_button.pack(pady=10)

def delete_account_page(username):

delete_window = tk.Toplevel()

delete_window.title("Delete Account")

delete_window.geometry("600x300")

delete_window.configure(bg="light pink")

# Main frame to center content

center_frame = tk.Frame(delete_window, bg="light pink")

center_frame.pack(expand=True) # Expands the frame to fill the window, centering content

# Confirmation message

confirm_label = tk.Label(center_frame, text="ARE YOU SURE YOU WANT TO PERMANENTLY DELETE


THIS ACCOUNT?",

font=("Times New Roman", 40, "bold"), bg="light pink", wraplength=500)

confirm_label.pack(pady=50)

# YES button: Deletes the account

def delete_account():

user_data = []

account_deleted = False

# Read and filter out the account to be deleted

with open("users.csv", mode="r") as file:

reader = csv.reader(file)

for row in reader:

if row[4] != username: # Assuming username is in the 5th column (index 4)

user_data.append(row)

else:
account_deleted = True

# Write back filtered data to the CSV file

with open("users.csv", mode="w", newline='') as file:

writer = csv.writer(file)

writer.writerows(user_data)

if account_deleted:

messagebox.showinfo("Account Deleted", "Your account has been successfully deleted.")

delete_window.destroy()

else:

messagebox.showerror("Error", "Username not found. Please try again.")

# YES Button

yes_button = tk.Button(center_frame, text="YES", font=("Times New Roman", 25), bg="white",


command=delete_account)

yes_button.pack(pady=30)

# NO Button

no_button = tk.Button(center_frame, text="NO", font=("Times New Roman", 25), bg="white",


command=delete_window.destroy)

no_button.pack(pady=30)

delete_window.mainloop()

def admin_login_page():

admin_window = tk.Toplevel()

admin_window.title("Admin Login")

admin_window.geometry("600x400")

admin_window.configure(bg="light pink")

# Title for Admin Login


title_label = tk.Label(admin_window, text="WELCOME, ADMIN", font=("Times New Roman", 24,
"bold"), bg="light pink")

title_label.pack(pady=30)

# Admin ID

admin_id_label = tk.Label(admin_window, text="Admin ID", font=("Times New Roman", 18),


bg="light pink")

admin_id_label.pack(pady=5)

admin_id_entry = tk.Entry(admin_window, font=("Times New Roman", 18))

admin_id_entry.pack(pady=5)

# Security Code

security_code_label = tk.Label(admin_window, text="Security Code", font=("Times New Roman",


18), bg="light pink")

security_code_label.pack(pady=5)

security_code_entry = tk.Entry(admin_window, show="*", font=("Times New Roman", 18))

security_code_entry.pack(pady=5)

# Function to validate admin credentials

def validate_admin_login():

admin_id = admin_id_entry.get()

security_code = security_code_entry.get()

# Check if admin credentials match

if admin_id == "natswas" and security_code == "123456":

messagebox.showinfo("Success", "Admin login successful!")

admin_window.destroy()

admin_dashboard_page()

else:

messagebox.showerror("Error", "Invalid Admin ID or Security Code. Please try again.")

# Login button
login_button = tk.Button(admin_window, text="Login", font=("Times New Roman", 18),
bg="white", command=validate_admin_login)

login_button.pack(pady=30)

admin_window.mainloop()

def admin_dashboard_page():

admin_dashboard_window = tk.Toplevel()

admin_dashboard_window.title("Admin Dashboard")

admin_dashboard_window.geometry("600x400")

admin_dashboard_window.configure(bg="light pink")

# Title

title_label = tk.Label(admin_dashboard_window, text="ADMIN DASHBOARD", font=("Times New


Roman", 48, "bold"), bg="light pink")

title_label.pack(pady=50)

# Button to delete a user's account

delete_user_button = tk.Button(admin_dashboard_window, text="DELETE A USER'S ACCOUNT",


font=("Times New Roman", 30), bg="white", command=delete_user_account)

delete_user_button.pack(pady=35)

# Button to generate a bill for a user

generate_bill_button = tk.Button(admin_dashboard_window, text="GENERATE A BILL FOR A


USER", font=("Times New Roman", 30), bg="white", command=generate_bill)

generate_bill_button.pack(pady=35)

admin_logout_button = tk.Button(admin_dashboard_window, text="LOG OUT(ADMIN)",


font=("Times New Roman", 30), bg="white")

admin_logout_button.pack(pady=35)

admin_dashboard_window.mainloop()
def delete_user_account():

delete_user_window = tk.Toplevel()

delete_user_window.title("Delete User Account")

delete_user_window.geometry("600x400")

delete_user_window.configure(bg="light pink")

# Title

title_label = tk.Label(delete_user_window, text="DELETE USER ACCOUNT", font=("Times New


Roman", 48, "bold"), bg="light pink")

title_label.pack(pady=50)

# Label and Entry for username input

username_label = tk.Label(delete_user_window, text="Enter the username of the user you want


to delete:", font=("Times New Roman", 24), bg="light pink")

username_label.pack(pady=10)

username_entry = tk.Entry(delete_user_window, font=("Times New Roman", 24))

username_entry.pack(pady=10)

# Function to delete the user when 'Delete User' button is pressed

def delete_user():

username_to_delete = username_entry.get().strip() # Remove any leading/trailing spaces

# Open the CSV file and read the contents

try:

with open('users.csv', 'r') as file:

lines = file.readlines()

# Write back all lines except the one with the username to be deleted

with open('users.csv', 'w') as file:

user_deleted = False

for line in lines:


# Strip any extra spaces from the stored username (5th column) and compare

if line.split(',')[4].strip() != username_to_delete:

file.write(line)

else:

user_deleted = True

if user_deleted:

messagebox.showinfo("Success", "USER ACCOUNT DELETED.")

delete_user_window.destroy() # Close the window after successful deletion

else:

messagebox.showerror("Error", "Username not found. Please check and try again.")

except FileNotFoundError:

messagebox.showerror("Error", "User data file not found.")

# Button to trigger the deletion

delete_button = tk.Button(delete_user_window, text="DELETE USER", font=("Times New Roman",


24), bg="white", command=delete_user)

delete_button.pack(pady=25)

delete_user_window.mainloop()

def generate_bill():

# Create a new window for generating bill

generate_bill_window = tk.Toplevel()

generate_bill_window.title("Generate Bill for a User")

generate_bill_window.geometry("600x500")

generate_bill_window.configure(bg="light pink")

# Title

title_label = tk.Label(generate_bill_window, text="Generate Bill for a User", font=("Times New


Roman", 30, "bold"), bg="light pink")
title_label.grid(row=0, column=0, columnspan=2, pady=25)

# Username

username_label = tk.Label(generate_bill_window, text="Enter Username:", font=("Times New


Roman", 20), bg="light pink")

username_label.grid(row=1, column=0, padx=10, pady=10, sticky="e")

username_entry = tk.Entry(generate_bill_window, font=("Times New Roman", 20), bg="white")

username_entry.grid(row=1, column=1, padx=10, pady=10)

# Month

month_label = tk.Label(generate_bill_window, text="Enter Month:", font=("Times New Roman",


20), bg="light pink")

month_label.grid(row=2, column=0, padx=10, pady=10, sticky="e")

month_entry = tk.Entry(generate_bill_window, font=("Times New Roman", 20), bg="white")

month_entry.grid(row=2, column=1, padx=10, pady=10)

# Year

year_label = tk.Label(generate_bill_window, text="Enter Year:", font=("Times New Roman", 20),


bg="light pink")

year_label.grid(row=3, column=0, padx=10, pady=10, sticky="e")

year_entry = tk.Entry(generate_bill_window, font=("Times New Roman", 20), bg="white")

year_entry.grid(row=3, column=1, padx=10, pady=10)

# Previous Date of Reading

previous_date_label = tk.Label(generate_bill_window, text="Enter Previous Date of Reading:",


font=("Times New Roman", 20), bg="light pink")

previous_date_label.grid(row=4, column=0, padx=10, pady=10, sticky="e")

previous_date_entry = tk.Entry(generate_bill_window, font=("Times New Roman", 20),


bg="white")

previous_date_entry.grid(row=4, column=1, padx=10, pady=10)

# Present Date of Reading


present_date_label = tk.Label(generate_bill_window, text="Enter Present Date of Reading:",
font=("Times New Roman", 20), bg="light pink")

present_date_label.grid(row=5, column=0, padx=10, pady=10, sticky="e")

present_date_entry = tk.Entry(generate_bill_window, font=("Times New Roman", 20), bg="white")

present_date_entry.grid(row=5, column=1, padx=10, pady=10)

# Previous Meter Reading

previous_meter_label = tk.Label(generate_bill_window, text="Enter Previous Meter Reading:",


font=("Times New Roman", 20), bg="light pink")

previous_meter_label.grid(row=6, column=0, padx=10, pady=10, sticky="e")

previous_meter_entry = tk.Entry(generate_bill_window, font=("Times New Roman", 20),


bg="white")

previous_meter_entry.grid(row=6, column=1, padx=10, pady=10)

present_meter_label = tk.Label(generate_bill_window, text="Enter Present Meter Reading:",


font=("Times New Roman", 20), bg="light pink")

present_meter_label.grid(row=7, column=0, padx=10, pady=10, sticky="e")

present_meter_entry = tk.Entry(generate_bill_window, font=("Times New Roman", 20),


bg="white")

present_meter_entry.grid(row=7, column=1, padx=10, pady=10)

# Function to save the bill details

def submit_bill():

username = username_entry.get().strip()

month = month_entry.get().strip()

year = year_entry.get().strip()

previous_date = previous_date_entry.get().strip()

present_date = present_date_entry.get().strip()

previous_meter = previous_meter_entry.get().strip()

present_meter = present_meter_entry.get().strip()

# Validation of the inputs


if not (username and month and year and previous_date and present_date and
previous_meter):

messagebox.showerror("Error", "Please fill in all the fields!")

return

# Create or open the user's specific file

file_name = f"{username}.csv"

# If the file doesn't exist, create a new one and write the headers

if not os.path.exists(file_name):

with open(file_name, mode='w', newline='') as file:

writer = csv.writer(file)

writer.writerow(["Username", "Month", "Year", "Previous Date", "Present Date", "Previous


Meter Reading", "Present Meter Reading"])

# Append the entered data to the user's file

with open(file_name, mode='a', newline='') as file:

writer = csv.writer(file)

writer.writerow([username, month, year, previous_date, present_date, previous_meter,


present_meter])

# Show success message

messagebox.showinfo("Success", "READINGS ENTERED SUCCESSFULLY")

generate_bill_window.destroy()

# Submit button

submit_button = tk.Button(generate_bill_window, text="Submit these entries", font=("Times New


Roman", 24), bg="white", command=submit_bill)

submit_button.grid(row=8, column=0, columnspan=2, pady=25)

generate_bill_window.mainloop()
import tkinter as tk

from tkinter import messagebox

import csv

import os

def view_bills():

# Create a new window for viewing the bill

view_bill_window = tk.Toplevel()

view_bill_window.title("View Your Electricity Bill")

view_bill_window.geometry("600x500")

view_bill_window.configure(bg="light pink")

# Title

title_label = tk.Label(view_bill_window, text="ENTER YEAR, MONTH AND YOUR USERNAME",


font=("Times New Roman", 25), bg="light pink")

title_label.grid(row=0, column=0, columnspan=2, pady=25)

# Username

username_label = tk.Label(view_bill_window, text="Enter Username:", font=("Times New Roman",


20), bg="light pink")

username_label.grid(row=1, column=0, padx=10, pady=10, sticky="e")

username_entry = tk.Entry(view_bill_window, font=("Times New Roman", 20), bg="white")

username_entry.grid(row=1, column=1, padx=10, pady=10)

# Month

month_label = tk.Label(view_bill_window, text="Enter Month:", font=("Times New Roman", 20),


bg="light pink")

month_label.grid(row=2, column=0, padx=10, pady=10, sticky="e")

month_entry = tk.Entry(view_bill_window, font=("Times New Roman", 20), bg="white")

month_entry.grid(row=2, column=1, padx=10, pady=10)

# Year
year_label = tk.Label(view_bill_window, text="Enter Year:", font=("Times New Roman", 20),
bg="light pink")

year_label.grid(row=3, column=0, padx=10, pady=10, sticky="e")

year_entry = tk.Entry(view_bill_window, font=("Times New Roman", 20), bg="white")

year_entry.grid(row=3, column=1, padx=10, pady=10)

# Function to search for the bill details and show the bill in a separate window

def show_bill():

username = username_entry.get().strip()

month = month_entry.get().strip()

year = year_entry.get().strip()

if not (username and month and year):

messagebox.showerror("Error", "Please fill in all the fields!")

return

file_name = f"{username}.csv"

# Check if the file exists

if not os.path.exists(file_name):

messagebox.showerror("Error", "User data not found!")

return

# Read the user's file to find the relevant bill

with open(file_name, mode='r', newline='') as file:

reader = csv.reader(file)

found = False

for row in reader:

if row[1] == month and row[2] == year:

found = True

previous_date = row[3]
present_date = row[4]

previous_meter = float(row[5])

present_meter = float(row[6])

# Calculate the amount consumed

amount_consumed = present_meter - previous_meter

# Calculate the charges

fixed_charges = 90

rate_per_kwh = 4.30

variable_charges = amount_consumed * rate_per_kwh

taxes = variable_charges * 0.03

total_payable = variable_charges + taxes

# Calculate last date to pay (add 14 days to the day part of the present date)

# present_date is assumed to be in the format "DD/MM/YYYY" (e.g., "03/10/2019")

day, month, year = map(int, present_date.split('/')) # Splitting the date into day, month,
and year

day += 14 # Add 14 days to the day part

# If day exceeds the number of days in the month, adjust month and year

# For simplicity, we assume all months have 30 days in this example (you can expand this
logic for exact month lengths)

if day > 30:

day -= 30

month += 1

if month > 12:

month = 1

year += 1

# Format the last date to pay as "DD/MM/YYYY"

last_date_to_pay = f"{day:02d}/{month:02d}/{year}"
# Create a new window to display the bill

bill_popup = tk.Toplevel(view_bill_window)

bill_popup.title("ELECTRICITY BILL")

bill_popup.geometry("600x500")

bill_popup.configure(bg="light pink")

bill_content = f"""

ELECTRICITY BILL

MONTH: {month}

YEAR: {year}

PREVIOUS DATE OF READING: {previous_date}

PRESENT DATE OF READING: {present_date}

PREVIOUS METER READING: {previous_meter} kWh

PRESENT METER READING: {present_meter} kWh

AMOUNT CONSUMED: {amount_consumed} kWh

Fixed charges: 90 Rs

Rate Per KWH: 4.30 Rs

VARIABLE CHARGES: {variable_charges} Rs

TAXES: {taxes} Rs

TOTAL PAYABLE AMOUNT: {total_payable} Rs

LAST DATE TO PAY: {last_date_to_pay}

"""

bill_label = tk.Label(bill_popup, text=bill_content, font=("Times New Roman", 18),


bg="light pink", justify="left")

bill_label.pack(pady=25)
# Back button to close the bill popup

back_button = tk.Button(bill_popup, text="Back", font=("Times New Roman", 18),


bg="white", command=bill_popup.destroy)

back_button.pack(pady=10)

break

if not found:

messagebox.showerror("Error", "No bill found for the given month and year.")

# Button to submit the details and generate the bill

submit_button = tk.Button(view_bill_window, text="Generate Bill", font=("Times New Roman",


24), bg="white", command=show_bill)

submit_button.grid(row=4, column=0, columnspan=2, pady=25)

# Button to go back to the user's page

back_button = tk.Button(view_bill_window, text="Back to User's Page", font=("Times New


Roman", 24), bg="white", command=view_bill_window.destroy)

back_button.grid(row=5, column=0, columnspan=2, pady=25)

view_bill_window.mainloop()

# Start the application

first_page()

You might also like