Analoginen kello Tkinterin Canvas-elementillä. Rakenne on pyritty pitämään yksinkertaisena. Ohjelman pitäisi toimia pythonin perusmoduuleilla (Tkinter, math ja time). Kommentit kertovat koodin toiminnasta tarkemmin.
Laittakaa ihmeessä kommenttia, jos keksitte paremman 'koneiston' kellolle. :)
(2021: moderaattori lisäsi Python 3 -tuen.)
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
if sys.version_info.major == 2:
from Tkinter import *
else:
from tkinter import *
import math
import time
class Kello:
#__init__ suoritetaan olion luonnissa
def __init__(self, root, koko=500, tausta="#dddddd",
vari_s="red", vari_m="green", vari_h="blue",
vari_num="black"):
#Keskuspisteen koordinaatit.
self.x1 = self.y1 = koko/2
self.koko = koko
#sekunnit, minuutit ja tunnit.
self.ss = 0
self.mm = 0
self.hh = 0
#Odotettava aika seuraavaan viisarinliikautukseen
self.odotus = 1000
#Luoaan Canvas elementti
self.c = Canvas(root, bg=tausta, height=koko, width=koko)
#Luodaan viisarit
self.sekunnit = self.c.create_line(0,0,1,0,fill=vari_s,smooth="true")
self.minuutit = self.c.create_line(0,0,1,0,fill=vari_m,smooth="true")
self.tunnit = self.c.create_line(0,0,1,0,fill=vari_h,smooth="true")
#Luodaan kellotaulun numerot
for i in range(12):
if i == 0:
teksti = "12"
else:
teksti = str(i)
#Käytetään koordinaatit-funktiota. Palautuksesta halutaan
#vain 2 jälkimmäistä (keskuspistettä ei tarvita)
self.c.create_text(self.koordinaatit(koko/2.1,i*30)[2:],
text=teksti, fill=vari_num)
#Tehdään osista näkyviä
self.c.pack()
#Haetaan aika käyttöjärjestelmältä
self.haeAika()
#Alustetaan ajastin, jota tarvitaan seuraavan odotusajan laskemiseen
self.ajastin = int(time.time())
#Käynnistetään kello
self.kaynnista()
def kaynnista(self):
#Odotusaika seuraavaan viisarinsiirtoon lasketaan tässä
self.odotus = int(1000 - (time.time() - self.ajastin)*1000)
#Odotusaika pitää laskea, koska odottamalla aina 1000ms kello
#alkaa jätättää.
#Tietyn ajan kuluttua suoritetaan käynnistä-funktio uudelleen
#Tähän käytetään Canvaksen after -funktiota
self.c.after(self.odotus,self.kaynnista)
self.ajastin += 1
#Lasketaan uudet koordinaatit viisareille. Tunneille ja minuuteille
#lisätään vielä osittaiset viisarinliikkeet
self.c.coords(self.sekunnit,
self.koordinaatit(self.koko/2.0,self.ss*6))
self.c.coords(self.minuutit,
self.koordinaatit(self.koko/2.2,self.mm*6+self.ss/10.0))
self.c.coords(self.tunnit,
self.koordinaatit(self.koko/3.0,self.hh*30+self.mm/2.0))
self.ss += 1
#Kellon mekanismi
if self.ss > 59:
self.ss = 0
self.mm += 1
if self.mm > 59:
self.mm = 0
self.hh += 1
if self.hh > 11:
self.hh = 0
#Tämä funktio laskee koordinaatit viisarille
def koordinaatit(self, pituus, kulma):
#Lasketaan trigonometrian avulla 'delta X' ja 'delta Y'
dy = int(abs(math.sin(math.radians(kulma+90)) * (pituus)))
dx = int(abs(math.cos(math.radians(kulma+90)) * (pituus)))
#Lasketaan neljäsosaympyröille koordinaatit erikseen
if kulma < 90:
x2 = self.x1 + dx
y2 = self.y1 - dy
elif kulma < 180:
x2 = self.x1 + dx
y2 = self.y1 + dy
elif kulma < 270:
x2 = self.x1 - dx
y2 = self.y1 + dy
else:
x2 = self.x1 - dx
y2 = self.y1 - dy
#Palautetaan lasketut arvot tuple tyyppisenä
return (self.x1,self.y1,int(x2),int(y2))
#Ajan hakemis -funktio
def haeAika(self):
#Tällä saa vuodet, päivät, tunnit, jne... taulukkoon.
t = time.localtime(time.time())
#Vain tunnit, minuutit ja sekunnit kiinnostavat.
t = t[3:6]
#Asetetaan saadut ajat Kelloon.
self.hh = t[0]
self.mm = t[1]
self.ss = t[2]
#Tunteja ei saa olla 12 tai enemmän.
while self.hh > 11:
self.hh -= 12
#Yleensä ikkuna nimetään 'root'
root = Tk()
#Luodaan kello
kello = Kello(root)
#Main Loop
root.mainloop()et muistanut laittaa tkinter tekstin alkukirjaimen pieneksi.
# ei hyväksy koska Tkinter sanassa on iso alkukirjain. from Tkinter import *
# nyt se hyvaksyy koska tkinter sanassa on pieni alku kirjain. from tkinter import *
Python2ssa on Tkinter isolla.
# python2 from Tkinter import *
olisi sama kuin
# python3 from tkinter import *
aaämdee kirjoitti:
# -*- coding: cp1252 -*- from Tkinter import *
???
Eikös olla jo päästy kivikaudesta, niin miksi et käytä utf-8:aa ja python3:sta?
#!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import *
Muuten ihan kiva pikku ohjelma.
Edit - Julkaisu olikin kivikaudelta, mutta noi muutokset voisi päivittää koodivinkkiin.
peran kirjoitti:
(14.10.2021 17:05:42): ”– –” ??? Eikös olla jo päästy...
Itse vaan ihmettelen miksi laskea mitään odotusaikaa viisarin siirtoon? Miksei vaan suoraan piirrä viisareille sitä tilaa minkä saa kun hakee järjestelmän kellonajan sekunnin välein?
Lisäsin koodiin Python 3 -tuen. Alkuperäinen tekijä tuskin on nyt koodia korjailemassa, kun koodi on 14 vuotta vanha ja tekijä ei ole edes kirjautunut kahdeksaan vuoteen. Voi miettiä, kannattaako kovin aktiivisesti kommentoida näin vanhoja koodeja vai voisiko mieluummin tuottaa jotain ihan uutta sisältöä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.