import tkinter as tk
from tkinter import ttk
from datetime import datetime
import pytz
from PIL import Image, ImageTk
# ---------------------------------------------------------
# Timezone Conversion Logic
# ---------------------------------------------------------
def convert_time():
ref_tz_name = ref_timezone.get().strip()
tgt_tz_name = tgt_timezone.get().strip()
ref_time_str = ref_time.get().strip()
try:
# Parse reference time
ref_dt = datetime.strptime(ref_time_str, "%H:%M")
# Attach today's date
today = datetime.now().date()
ref_dt = datetime.combine(today, ref_dt.time())
# Localize to reference timezone
ref_zone = pytz.timezone(ref_tz_name)
ref_dt = ref_zone.localize(ref_dt)
# Convert to target timezone
tgt_zone = pytz.timezone(tgt_tz_name)
tgt_dt = ref_dt.astimezone(tgt_zone)
# Determine D-, D, D+
if tgt_dt.date() < today:
d_flag = "D-"
elif tgt_dt.date() > today:
d_flag = "D+"
else:
d_flag = "D"
# Display result
result_time.set(tgt_dt.strftime("%H:%M"))
result_date.set(d_flag)
except Exception:
result_time.set("Error")
result_date.set("Check inputs")
# ---------------------------------------------------------
# Zoomable Image Popup
# ---------------------------------------------------------
def show_timezone_chart():
popup = tk.Toplevel(root)
popup.title("Timezone Chart")
popup.configure(bg="#ffffff")
# Load original image
original_img = Image.open("Images/Timezones.png")
# State for zooming
popup.zoom_level = 1.0
popup.original_img = original_img
# Canvas for image
canvas = tk.Canvas(popup, bg="white", width=900, height=450)
canvas.pack(fill="both", expand=True)
# Function to redraw image at current zoom level
def redraw_image():
zoom = popup.zoom_level
w = int(original_img.width * zoom)
h = int(original_img.height * zoom)
resized = original_img.resize((w, h), Image.LANCZOS)
popup.photo = ImageTk.PhotoImage(resized)
canvas.delete("all")
canvas.create_image(0, 0, anchor="nw", image=popup.photo)
canvas.config(scrollregion=(0, 0, w, h))
# Zoom controls
def zoom_in():
popup.zoom_level *= 1.2
redraw_image()
def zoom_out():
popup.zoom_level /= 1.2
redraw_image()
# Mouse wheel zoom
def mouse_zoom(event):
if event.delta > 0:
popup.zoom_level *= 1.1
else:
popup.zoom_level /= 1.1
redraw_image()
canvas.bind("<MouseWheel>", mouse_zoom)
# Buttons
btn_frame = tk.Frame(popup, bg="white")
btn_frame.pack(pady=10)
tk.Button(btn_frame, text="Zoom In", command=zoom_in,
font=("Arial", 12), bg="#66aaff", fg="white").grid(row=0, column=0, padx=10)
tk.Button(btn_frame, text="Zoom Out", command=zoom_out,
font=("Arial", 12), bg="#66aaff", fg="white").grid(row=0, column=1, padx=10)
tk.Button(btn_frame, text="Close", command=popup.destroy,
font=("Arial", 12), bg="#ffcc00").grid(row=0, column=2, padx=10)
# Initial draw
redraw_image()
# ---------------------------------------------------------
# GUI Setup
# ---------------------------------------------------------
root = tk.Tk()
root.title("Timezone Converter")
root.geometry("520x420")
root.configure(bg="#f0f4ff")
title_label = tk.Label(root, text="TIMEZONE", font=("Arial", 22, "bold"),
bg="#f0f4ff", fg="#003366")
title_label.pack(pady=10)
frame = tk.Frame(root, bg="#f0f4ff")
frame.pack(pady=10)
# ---------------------------------------------------------
# Reference Section
# ---------------------------------------------------------
ref_label = tk.Label(frame, text="Reference", font=("Arial", 14, "bold"),
fg="#0044aa", bg="#f0f4ff")
ref_label.grid(row=0, column=0, padx=20)
tk.Label(frame, text="Timezone:", bg="#f0f4ff").grid(row=1, column=0)
ref_timezone = tk.Entry(frame, width=20)
ref_timezone.grid(row=2, column=0, pady=5)
tk.Label(frame, text="Time (HH:MM):", bg="#f0f4ff").grid(row=3, column=0)
ref_time = tk.Entry(frame, width=20)
ref_time.grid(row=4, column=0, pady=5)
# ---------------------------------------------------------
# Target Section
# ---------------------------------------------------------
tgt_label = tk.Label(frame, text="Target", font=("Arial", 14, "bold"),
fg="#aa0066", bg="#f0f4ff")
tgt_label.grid(row=0, column=1, padx=20)
tk.Label(frame, text="Timezone:", bg="#f0f4ff").grid(row=1, column=1)
tgt_timezone = tk.Entry(frame, width=20)
tgt_timezone.grid(row=2, column=1, pady=5)
# ---------------------------------------------------------
# Buttons
# ---------------------------------------------------------
calc_button = tk.Button(root, text="Calculate", font=("Arial", 14, "bold"),
bg="#ffcc00", fg="black", command=convert_time)
calc_button.pack(pady=10)
chart_button = tk.Button(root, text="View Timezone Chart",
font=("Arial", 12, "bold"),
bg="#66aaff", fg="white",
command=show_timezone_chart)
chart_button.pack(pady=5)
# ---------------------------------------------------------
# Output Section
# ---------------------------------------------------------
output_frame = tk.Frame(root, bg="#f0f4ff")
output_frame.pack(pady=10)
tk.Label(output_frame, text="Target Time:", bg="#f0f4ff",
font=("Arial", 12)).grid(row=0, column=0)
result_time = tk.StringVar()
tk.Label(output_frame, textvariable=result_time, bg="#f0f4ff",
font=("Arial", 16, "bold"), fg="#aa0066").grid(row=0, column=1, padx=10)
tk.Label(output_frame, text="Date:", bg="#f0f4ff",
font=("Arial", 12)).grid(row=1, column=0)
result_date = tk.StringVar()
tk.Label(output_frame, textvariable=result_date, bg="#f0f4ff",
font=("Arial", 16, "bold"), fg="#cc0000").grid(row=1, column=1, padx=10)
root.mainloop()