2024-10-22 05:03:27 +02:00
#2024 ixkakaw. This is a analog world clock script that works by timezones.
import tkinter as tk
import time
import math
from datetime import datetime
from pytz import timezone
import sys
from tkinter import *
W = 146 # oval position makes outline of oval to dissapear. Adjusted by subtracting one unit from W and H
H = 146 # height and width of each clock oval.
CH = 150 # height and width of each clock oval.
CW = 150
PX = 7 # x padding of each canvas.
PY = 7
color = " #212121 " #background color
root = tk . Tk ( ) #initiates main window
root . title ( " Analog World Clocks " ) #window title
root . config ( bg = color ) #window color
canvas_vienna = Canvas ( root , width = CW , height = CH , bg = color , #creates single canvas for each clock to be used for the_clock function. bd=0, highlightthickness=0 disables canvas border.
relief = ' flat ' , bd = 0 , highlightthickness = 0 )
canvas_guatemala = Canvas ( root , width = CW , height = CH , bg = color ,
relief = ' flat ' , bd = 0 , highlightthickness = 0 )
canvas_montevideo = Canvas ( root , width = CW , height = CH , bg = color ,
relief = ' flat ' , bd = 0 , highlightthickness = 0 )
canvas_calcutta = Canvas ( root , width = CW , height = CH , bg = color ,
relief = ' flat ' , bd = 0 , highlightthickness = 0 )
canvas_kamchatka = Canvas ( root , width = CW , height = CH , bg = color ,
relief = ' flat ' , bd = 0 , highlightthickness = 0 )
def the_clock ( region , city , canvas , C ) :
canvas . grid ( row = 0 , column = C , padx = PX , pady = PY ) #constructs the grid so that clocks are aligned in single row
canvas . delete ( " all " ) #deletes the animation of arrows with each iteration
datetime . now ( timezone ( region ) ) . time ( ) #obtains the time according to region
x = datetime . now ( timezone ( region ) ) . hour
y = datetime . now ( timezone ( region ) ) . minute
z = datetime . now ( timezone ( region ) ) . second
hour = x % 12
minute = y
second = z
canvas . create_oval ( 2 , 2 , H , W , outline = " #0D7377 " ,
width = 0.5 , fill = ' #323232 ' ) #draws cirle enclosing clock
canvas . create_text ( CH / 2 , CW / 2 , text = str ( city ) ,
fill = " #14FFEC " , font = ( " Helvetica 13 bold " ) ) #prints text of city inside each clock
for i in range ( 12 ) : #draws the numbers
angle = i * math . pi / 6 - math . pi / 2
x = ( W ) / 2 + 0.8 * ( W ) / 2 * math . cos ( angle )
y = ( H ) / 2 + 0.8 * ( H ) / 2 * math . sin ( angle )
if i == 0 :
canvas . create_text ( x , y , text = str ( i + 12 ) , fill = " #FBFF64 " , font = ( " helvetica " , 9 ) )
else :
canvas . create_text ( x , y , text = str ( i ) , fill = " #FBFF64 " , font = ( " helvetica " , 9 ) )
hour_angle = ( hour + minute / 60 ) * math . pi / 6 - math . pi / 2 #draws hours' hand
hour_x = W / 2 + 0.5 * W / 2 * math . cos ( hour_angle )
hour_y = H / 2 + 0.5 * H / 2 * math . sin ( hour_angle )
canvas . create_line ( W / 2 , H / 2 , hour_x , hour_y , fill = " #FF0032 " , width = 4 )
minute_angle = ( minute + second / 60 ) * math . pi / 30 - math . pi / 2 #draws minutes' hand
minute_x = W / 2 + 0.7 * W / 2 * math . cos ( minute_angle )
minute_y = H / 2 + 0.7 * H / 2 * math . sin ( minute_angle )
canvas . create_line ( W / 2 , H / 2 , minute_x , minute_y , fill = " #FF0032 " , width = 2 )
second_angle = second * math . pi / 30 - math . pi / 2 #draws seconds' hand
second_x = W / 2 + 0.6 * W / 2 * math . cos ( second_angle )
second_y = H / 2 + 0.6 * W / 2 * math . sin ( second_angle )
canvas . create_line ( W / 2 , H / 2 , second_x , second_y , fill = " #FF0032 " , width = 1 )
canvas . after ( 1000 , the_clock , region , city , canvas , C )
the_clock ( ' Europe/Vienna ' , ' Vienna ' , canvas_vienna , 0 ) #calls the function the_clock for each region
the_clock ( ' America/Guatemala ' , ' Guatemala ' , canvas_guatemala , 1 )
the_clock ( ' America/Montevideo ' , ' Montevideo ' , canvas_montevideo , 2 )
the_clock ( ' Asia/Calcutta ' , ' Calcutta ' , canvas_calcutta , 3 )
the_clock ( ' Asia/Kamchatka ' , ' Kamchatka ' , canvas_kamchatka , 4 )
root . mainloop ( ) # runs the main loop
#colors and regions can be changed accordingly. For more regions check: https://mljar.com/blog/list-pytz-timezones/ or the README file.