import random import sys import time import turtle as t LEVEYS = 800 KORKEUS = 600 NAPPI_LEVEYS = 200 NAPPI_KORKEUS = 60 VASEN = 0 OIKEA = 1 YLA = 2 ALA = 3 ikkuna = [] tila = { "piirto": False, "kaynnissa": False } def luo_ikkuna(otsikko): """ Luo "ikkunan" johon käyttöliittymän kehykset ja elementit voidaan kerätä. Tässä approksimaatiossa ikkuna on vain lista, johon elementit lisätään. Tämä funktio ainoastaan tyhjää olemassaolevan ikkunalistan. """ ikkuna.clear() return ikkuna def luo_kehys(isanta, puoli=VASEN): """ Luo kehyksen. Tämä funktio hieman huijaa, ja lisää kehyksen suoraan ikkunaan riippumatta siitä mitä parametrien arvot ovat. Kirjasto ei siis tue sisäkkäisiä kehyksiä, eikä alekkaisia kehyksiä. """ kehys = [] ikkuna.append(kehys) return kehys def luo_nappi(kehys, teksti, toiminto): """ Luo napin, eli lisää kehykseen nappia kuvaavan sanakirjan. Napin sijainti lasketaan kehyksen indeksistä ikkunan sisällä sekä kehyksessä jo olevien nappien lukumäärästä siten, että napin leveydeksi tulee NAPPI_LEVEYS ja korkeudeksi NAPPI_KORKEUS yksikköä. """ vasen = ikkuna.index(kehys) * NAPPI_LEVEYS oikea = vasen + NAPPI_LEVEYS yla = len(kehys) * NAPPI_KORKEUS ala = yla + NAPPI_KORKEUS kehys.append({ "vasen": vasen, "oikea": oikea, "yla": yla, "ala": ala, "teksti": teksti, "toiminto": toiminto }) def lue_klikkaus(): """ Funktio joka tuottaa uuden "klikkauksen". Toistaiseksi generoi satunnaisen pisteen joka on "ikkunan" rajojen sisällä. """ x = random.randint(0, LEVEYS - 1) y = random.randint(0, KORKEUS - 1) return x, y def tunnista_nappi(x, y, ikkuna): """ Etsii mihin nappiin klikkaus osui ikkunan sisällä, jos mihinkään. Mikäli klikkaus osui nappin rajojen sisälle, kutsuu nappiin kiinnitettyä toiminto-funktiota. """ for kehys in ikkuna: for nappi in kehys: if nappi["vasen"] <= x <= nappi["oikea"]: if nappi["yla"] <= y <= nappi["ala"]: funktio = nappi["toiminto"] funktio() return def kaynnista(): """ Lukee klikkauksia ja tarkistaa osuiko klikkaus nappiin. Silmukkaa suoritetaan niin kauan kuin tilasanakirjassa oleva "kaynnissa" arvo on True. Mikäli piirto valittiin tehtäväksi ohjelman käynnistyksessä, piirtää nappien alueet sekä klikkauspisteet näkyviin. """ tila["kaynnissa"] = True if tila["piirto"]: nayta_ikkuna() while tila["kaynnissa"]: print(".", end="", flush=True) hiiri_x, hiiri_y = lue_klikkaus() if tila["piirto"]: t.up() t.setx(hiiri_x - LEVEYS / 2) t.sety(KORKEUS / 2 - hiiri_y) t.down() t.dot() tunnista_nappi(hiiri_x, hiiri_y, ikkuna) # lisätty jotta ohjelma ei pyöri liian nopeasti time.sleep(0.1) if tila["piirto"]: t.done() def lopeta(): """ Asettaa tilasanakirjassa olevan lipun Falseksi, jolloin kaynnista-funktiossa pyörivä pääsilmukka katkeaa ja ohjelma päättyy. """ tila["kaynnissa"] = False def nayta_ikkuna(): """ Piirtää kuvan ikkunasta turtlella. """ t.up() t.setx(-1 * LEVEYS / 2) t.sety(KORKEUS / 2) t.down() t.forward(LEVEYS) t.right(90) t.forward(KORKEUS) t.right(90) t.forward(LEVEYS) t.right(90) t.forward(KORKEUS) t.right(90) for kehys in ikkuna: for nappi in kehys: t.up() t.setx(nappi["vasen"] - LEVEYS / 2) t.sety(KORKEUS / 2 - nappi["yla"]) t.down() t.forward(NAPPI_LEVEYS) t.right(90) t.forward(NAPPI_KORKEUS) t.right(90) t.forward(NAPPI_LEVEYS) t.right(90) t.forward(NAPPI_KORKEUS) t.right(90) try: if sys.argv[1].lower() in ["-p", "--piirto"]: tila["piirto"] = True except IndexError: pass