This Tkinter-based GUI application calculates salaries based on user-defined settings stored in a JSON file.
settings.json
file to retain preferences across sessions.settings.json
.settings.json
is missing, the application creates it with default values.E:\testing\settings.json
load_settings()
).save_settings()
).import tkinter as tk
from tkinter import ttk
import json
import os
We define the file path for storing settings and provide default values for allowances and employee type.
SETTINGS_FILE = "F:\\testing\\settings.json" # Update your path
DEFAULT_SETTINGS = {
"da_percent": 20,
"hra_percent": 10,
"medical_allowance": 500,
"transport_allowance": 300,
"employee_type": "Regular",
"shift_allowance": 200
}
---
def load_settings():
if os.path.exists(SETTINGS_FILE):
with open(SETTINGS_FILE, "r") as file:
data = json.load(file)
else:
data = DEFAULT_SETTINGS
return data
def save_settings():
settings = {
"da_percent": da_var.get(),
"hra_percent": hra_var.get(),
"medical_allowance": medical_var.get(),
"transport_allowance": transport_var.get(),
"employee_type": emp_type_var.get(),
"shift_allowance": shift_allowance_var.get() if emp_type_var.get() == "Regular" else 0
}
with open(SETTINGS_FILE, "w") as file:
json.dump(settings, file, indent=4)
---
We use a Notebook widget to create two tabs:
The salary is calculated dynamically based on user settings.
home_frame = tk.Frame(notebook, bg="#FFFACD")
notebook.add(home_frame, text="Salary Breakdown")
---
Users can adjust allowances, DA, and HRA through sliders and spinboxes.
settings_frame = tk.Frame(notebook, bg="#FFCCCB")
notebook.add(settings_frame, text="Settings")
---
import tkinter as tk
from tkinter import ttk
import json
import os
# JSON file path
SETTINGS_FILE = "E:\\testing\\settings.json"
# Default settings
DEFAULT_SETTINGS = {
"da_percent": 20,
"hra_percent": 10,
"medical_allowance": 500,
"transport_allowance": 300,
"employee_type": "Regular",
"shift_allowance": 200
}
# Function to load settings from JSON file
def load_settings():
if os.path.exists(SETTINGS_FILE):
with open(SETTINGS_FILE, "r") as file:
data = json.load(file)
# Ensure all required keys exist, otherwise, assign default values
for key, default_value in DEFAULT_SETTINGS.items():
if key not in data:
data[key] = default_value
return data
else:
return DEFAULT_SETTINGS
# Function to save settings to JSON file
def save_settings():
settings = {
"da_percent": da_var.get(),
"hra_percent": hra_var.get(),
"medical_allowance": medical_var.get(),
"transport_allowance": transport_var.get(),
"employee_type": emp_type_var.get(),
"shift_allowance": shift_allowance_var.get() if emp_type_var.get() == "Regular" else 0
}
with open(SETTINGS_FILE, "w") as file:
json.dump(settings, file, indent=4)
update_salary_display()
# Function to calculate salary based on settings
def calculate_salary():
settings = load_settings()
basic_pay = 5000
grade_pay = 1300 # Fixed, no setting
da_amount = (settings["da_percent"] / 100) * basic_pay
hra_amount = (settings["hra_percent"] / 100) * basic_pay
total_salary = (
basic_pay + grade_pay +
da_amount +
hra_amount +
settings["medical_allowance"] +
settings["transport_allowance"] +
(settings["shift_allowance"] if settings["employee_type"] == "Regular" else 0)
)
return {
"Basic Pay": (basic_pay, "blue"), # Fixed Salary in Blue
"Grade Pay": (grade_pay, "blue"),
"DA Amount": (da_amount, "orange"), # DA & HRA (Linked to Basic Pay) in Orange
"HRA Amount": (hra_amount, "orange"),
"Medical Allowance": (settings["medical_allowance"], "red"), # Other Allowances in Red
"Transport Allowance": (settings["transport_allowance"], "red"),
"Shift Allowance": ((settings["shift_allowance"] if settings["employee_type"] == "Regular" else 0), "blue"),
"Total Salary": (total_salary, "green") # Total Salary Highlighted
}
# Function to update salary display in Home Tab
def update_salary_display():
salary_details = calculate_salary()
# Update labels with the new salary values
for i, (key, (value, color)) in enumerate(salary_details.items()):
salary_labels[i].config(text=f"{key}:", anchor="w", fg=color)
salary_values[i].config(text=f"₹{value:.2f}", anchor="e", fg=color)
# Highlight Total Salary
salary_values[7].config(font=("Arial", 14, "bold"))
# Load settings at startup
settings = load_settings()
# Create the main Tkinter window
root = tk.Tk()
root.title("plus2net.com Salary Calculator with JSON Settings")
root.geometry("500x450")
# Create a Notebook (Tabs)
notebook = ttk.Notebook(root)
notebook.pack(fill="both", expand=True)
### --- Home Tab (Salary Display) ---
home_frame = ttk.Frame(notebook)
notebook.add(home_frame, text="Salary Breakdown")
# Create Labels for Salary Breakdown
salary_labels = []
salary_values = []
for i in range(8):
label = tk.Label(home_frame, text="", font=("Arial", 11), width=18, anchor="w")
label.grid(row=i, column=0, padx=30, pady=5)
salary_labels.append(label)
value = tk.Label(home_frame, text="", font=("Arial", 11, "bold"), width=12, anchor="e")
value.grid(row=i, column=1, padx=1, pady=5)
salary_values.append(value)
update_salary_display()
### --- Settings Tab ---
settings_frame = tk.Frame(notebook, bg="#e0e0e0") # Light grey background
notebook.add(settings_frame, text="Settings")
# Header Label
tk.Label(settings_frame, text="Settings", font=("Arial", 16, "bold"), bg="#e0e0e0", fg="black").grid(row=0, column=0, columnspan=3, pady=10)
# DA Percentage (Slider) - Matching Colors
tk.Label(settings_frame, text="DA Percentage:", font=("Arial", 12), bg="#e0e0e0", fg="orange").grid(row=1, column=0, sticky="w", padx=10, pady=20)
da_var = tk.IntVar(value=settings["da_percent"])
tk.Scale(settings_frame, from_=0, to=100, orient="horizontal", variable=da_var, bg="#d0f0c0", length=300).grid(row=1, column=1, columnspan=2, sticky="w")
# HRA Percentage (Slider) - Matching Colors
tk.Label(settings_frame, text="HRA Percentage:", font=("Arial", 12), bg="#e0e0e0", fg="orange").grid(row=2, column=0, sticky="w", padx=10, pady=20)
hra_var = tk.IntVar(value=settings["hra_percent"])
tk.Scale(settings_frame, from_=0, to=100, orient="horizontal", variable=hra_var, bg="#d0f0c0", length=300).grid(row=2, column=1, columnspan=2, sticky="w")
# Medical Allowance (Spinbox)
tk.Label(settings_frame, text="Medical Allowance:", font=("Arial", 12), bg="#e0e0e0", fg="red").grid(row=3, column=0, sticky="w", padx=10, pady=5)
medical_var = tk.IntVar(value=settings["medical_allowance"])
tk.Spinbox(settings_frame, from_=0, to=1000, textvariable=medical_var, width=5).grid(row=3, column=1, sticky="w")
# Transport Allowance (Spinbox)
tk.Label(settings_frame, text="Transport Allowance:", font=("Arial", 12), bg="#e0e0e0", fg="red").grid(row=4, column=0, sticky="w", padx=10, pady=5)
transport_var = tk.IntVar(value=settings["transport_allowance"])
tk.Spinbox(settings_frame, from_=0, to=1000, textvariable=transport_var, width=5).grid(row=4, column=1, sticky="w")
# Employee Type (Radiobutton)
tk.Label(settings_frame, text="Employee Type:", font=("Arial", 12), bg="#e0e0e0", fg="black").grid(row=5, column=0, sticky="w", padx=10, pady=15)
emp_type_var = tk.StringVar(value=settings["employee_type"])
tk.Radiobutton(settings_frame, text="Regular", variable=emp_type_var, value="Regular", bg="#e0e0e0").grid(row=5, column=1, sticky="w")
tk.Radiobutton(settings_frame, text="Contract", variable=emp_type_var, value="Contract", bg="#e0e0e0").grid(row=5, column=2, sticky="w")
tk.Label(settings_frame, text="Shift Allowance:", font=("Arial", 12), bg="#e0e0e0", fg="blue").grid(row=6, column=0, sticky="w", padx=10, pady=5)
shift_allowance_var = tk.IntVar(value=settings["shift_allowance"])
tk.Spinbox(settings_frame, from_=0, to=1000, textvariable=shift_allowance_var, width=5).grid(row=6, column=1, sticky="w")
# Save Button
save_button = tk.Button(settings_frame, text="Save Settings", font=("Arial", 12, "bold"), command=save_settings, bg="blue", fg="white")
save_button.grid(row=7, column=0, columnspan=3, pady=10)
# Run Tkinter event loop
root.mainloop()
This tutorial provides a fully functional Tkinter settings page using JSON for persistence. Try modifying different values in the settings tab and watch real-time updates!
Payroll Management App Json data viewer by using Treeview