Ura

Ura

Avtor: Miklavž Šef

Učni cilji: Predstavitev povezljivosti med Scratch2 in Python

Izdelava ure v Scratch-u

(ura scratch1.png)
ura v Scratch-u

Izdelava ure v Scratch

Priprava kazalcev

Za kazalce bomo uporabili slikice iz galerije, lahko pa uporabimo tudi daljice različnih dolžin ali pa pikice. Dodamo znak za zagon ob pritisku na zastavico. Vsem kazalcem moramo nastaviti, kako se naj obnašajo. Za to jim nastavimo smer vrtenja na "all around (vse okoli)", ter pozicijo sredine kazalca x na 0 in y na 0. V oblikovanju slike poskrbimo za zadosten odmik glede na sredino, ure nekoliko manj kot sekunde in minute. S tem smo pripravili izris kazalca. To naredimo za VSE kazalce.

(ura scratch nastavitev kazalca.png)

Izdelava ure v Scratch-u

Branje podatkov in uporaba

Branje podatkov Podatke o dejanski uri bere Scratch iz sistemske ure. Branje lahko nastavimo lahko direktno ali pa ustvarimo spremenljiovko (na primer za ure spremenljivka "ure"). V našem primeru ustvarimo spremenljivko "ura" pod orodjem "Data" ter dodelimo branje sistemske ure pod "Sensing" in "curent", kjer izberemo za ure "hour".

(ura scratch spremenljivka.png)

Uporaba podtakov Podatke shranjene v spremenljivki uporabimo pri določanju smeri kazalca. Odvisno kako je osnovna slikica obrnjena je treba prirediti začetno vrednost. V našem primeru je zaradi osnovne slikice 90 (stopinj).

(ura scratch pot kazalca.png)

Izdelava ure v Scratch-u

Delovanje ure

Ura je do sedaj prebrala samo kako naj trenutno postavi kazalec. Za delovanje pa potrebujemo redno spremembo postavitve kazalcev. To dosežemo s ponavljanjem branja podatkov in izrisovanjem. Temu pravimo zanka. V našem primeru je uporabljena neskončna zanka.

(ura scratch zanka.png)

Izdelava ure v Scratch-u

Celotni zapis za urni kazalec

(ura scratch ure.png)

Za minutni in sekundni kazalec moramo vzeti novo sliko iz albuma ter za vsakega posebaj sestavimo ukaze, kot za urni kazalec, pri čemer skrbimo, da priredimo spremenljivko in branje podatkov s sistemske ure.

Izdelava ure v Python-u

(ura python1.png)
ura v Python-u

Izdelava ure v Python-u

Priprava okolja

V Scatch-u imamo okolje pripravljeno z zagonom programa. V pythonu moramo najprej naložiti knjižnice iz katerih bomo uporabljali finkcije. Prikličemo jih z ukazom:

  • Za risanje: import tkinter
  • Za računanje kotov: import math
  • Za branje časa: import time

Določiti moramo kje se bo izrisovala ura z ukazi:

  • Za okno izrisa: platno = tkinter.Canvas(okno, width = 200, height = 200, background="brown")
  • Za krožnico ure (v Scratchu tega nismo narisali): platno.create_oval (2,2,201,201, fill="yellow")

Izdelava ure v Pythonu-u

Branje podatkov

Podatke o dejanski uri bere Python iz sistemske ure. Podatke sistemske ure shranimo v spremenljivko cas = time.localtime(), ki shrani uro v obliki zaporednih vrednosti (tm_year=2014, tm_mon=1, tm_mday=11, tm_hour=1, tm_min=1, tm_sec=1, tm_wday=1, tm_yday=1, tm_isdst=1) ter pretvorimo prebrano v niz in shranimo v spremenljivko "nizcas" nizcas = list (cas).

Določiti moramo za vsako spremenljivko branje iz določenega dela podatkov (nizcas). Za ure uporabimo branje na četrtem mestu in ustvarimo spremenljivko ure ure = nizcas[3]. Pri branju je potrebno biti pozoren, saj se zaporedje podatkov v nizcas steje od 0.

Izdelava ure v Pythonu-u

Uporaba podatkov

Podatke shranjene v spremenljivki uporabimo pri določanju smeri kazalca in njegovo vrtenje (končno točko daljice, ji predstavlja uro).

urX = 100+100*math.sin(6*ure*5*math.pi/180)*0.60

urY = 100-100*math.cos(6*ure*5*math.pi/180)*0.60

(s koeficientom 0,6 se skrajša dolžino urinega kazalca)

Izris urinega kazalca pa naredimo kot izris daljice

platno.create_line(100,100,urX,urY,width=3, fill="blue")

Izdelava ure v Pythonu-u

Delovanje ure

Ura je do sedaj prebrala samo kako naj trenutno postavi kazalec. Za delovanje pa potrebujemo redno spremembo postavitve kazalcev. To dosežemo s ponavljanjem branja podatkov in izrisovanjem. Celotno branje in izrisovanje kazalcev bomo klicali s funkcijo, ki jo bomo neskončnokrat klicali.
Funkcijo ustvarimo s

def urica():

ter podrejeno vpišemo ukaze za branje časa ter spremenljivke in izrisovanje kazalca vanjo. V funkciji tudi določimo na koliko časa naj ponovno izriše uro z ukazom:

platno.after(1000, urica)

Ceoten zapis funkcije za izpis ure bi izgledal tako:

def urica():
    cas = time.localtime() #preberemo čas
    nizcas = list (cas)
    ure = nizcas[3]
    urX = 100+100*math.sin(6*ure*5*math.pi/180)*0.60
    urY = 100-100*math.cos(6*ure*5*math.pi/180)*0.60
    platno.create_oval (2,2,201,201, fill="yellow")
    platno.create_line(100,100,urX,urY,width=3, fill="blue")
    platno.after(1000, urica)

V samem programu moramo še nastaviti klicanje funkcije s:

urica()

Na koncu dodamo še neskončno zanko za izrisovanje:

okno.mainloop()

Za minutni in urni kazalec moramo prav tako dodeliti spremenljivke ter izris ter vstaviti funkcijo.

Izdelava ure v Pythonu-u

Celoten program

import tkinter
import math
import time
def urica():
    cas = time.localtime() #preberemo čas
    nizcas = list (cas)
    sekunde = nizcas[5] #preberemo ločeno podatke za čas
    minute = nizcas[4]
    ure = nizcas[3]
    dan = nizcas[2]
    mesec = nizcas[1]
    leto = nizcas[0]
    sekX = 100+100*math.sin(6*sekunde*math.pi/180) #določimo nove koordinate zaključka daljice, ki predstavljajo kazalce
    sekY = 100-100*math.cos(6*sekunde*math.pi/180)
    minX = 100+100*math.sin(6*minute*math.pi/180)*0.90
    minY = 100-100*math.cos(6*minute*math.pi/180)*0.90
    urX = 100+100*math.sin(6*ure*5*math.pi/180)*0.60
    urY = 100-100*math.cos(6*ure*5*math.pi/180)*0.60
    platno.create_oval (2,2,201,201, fill="yellow") # narišemo krožnico za uro
    platno.create_line(100,100,urX,urY,width=3, fill="blue") # kazalec za ure
    platno.create_line(100,100,minX,minY, width=3, fill="red") #kazalec za minute
    platno.create_line(100,100,sekX,sekY) # kazalec za sekunde
    platno.after(1000, urica) #ponovi po 1000 ms
    platno.create_text(100,150, text=(ure,minute,sekunde)) # dodatna digitalna ura
okno = tkinter.Tk()
platno = tkinter.Canvas(okno, width = 200, height = 200, background="brown")
platno.pack()
urica()
okno.mainloop()
0%
0%