def lisaaKomponentti(): """ Lisää komponentin haaraan. """ komp = ikn.lue_kentan_sisalto(KLIITTYMÄ["syote"[0]]).strip().lower() arvo = ikn.lue_kentan_sisalto(KLIITTYMÄ["syote"[1]]).strip() id = ikn.lue_kentan_sisalto(KLIITTYMÄ["syote"[2]]).strip() sallitut = ("v", "r", "k", "l", "c") if not komp in sallitut: ikn.avaa_viesti_ikkuna("Virhe!", "Komponentti ei ollut kelvollinen.", True) ikn.tyhjaa_kentan_sisalto(KLIITTYMÄ["syote"[0]]) return if komp == "v": komp = "r" elif komp == "k": komp = "l" arvo = sim.muunnaSi(arvo) if not arvo: ikn.avaa_viesti_ikkuna("Virhe!", "Arvo ei ollut kelvollinen.", True) ikn.tyhjaa_kentan_sisalto(KLIITTYMÄ["syote"[1]]) return komp = (komp, arvo) id = tarkistaID(id) KLIITTYMÄ["komponentit"][id].append(komp) komponenttilistaus() piirtaja()
def ikkunasto_napin_kasittelija(): sisaltox = ikkunasto.lue_kentan_sisalto(kysyja.kenttax) sisaltoy = ikkunasto.lue_kentan_sisalto(kysyja.kenttay) try: xy.append(int(sisaltox)) xy.append(int(sisaltoy)) ikkunasto.lopeta() except ValueError: ikkunasto.avaa_viesti_ikkuna("Virhe!", "positiivisia kokonaislukuja, kiitos.", True)
def ok(): try: parametrit["korkeus"] = int( ik.lue_kentan_sisalto(palikat["korkeuskentta"])) parametrit["leveys"] = int( ik.lue_kentan_sisalto(palikat["leveyskentta"])) parametrit["miinalkm"] = int( ik.lue_kentan_sisalto(palikat["miinatkentta"])) ik.piilota_ali_ikkuna(palikat["valinnat"]) except ValueError: ik.avaa_viesti_ikkuna("Virhe", "Syötä kolme kokonaislukua", virhe=True)
def aseta_jannite(): """ Pyytää käyttäjältä tarvittavat tiedot piirin virran laskemiseksi. Kyselyä toistetaan kunnes tarvittavat tiedot on annettu. Jännite annettama ilman merkintää V, mutta voidaan antaa kerrannaisyksikön kanssa, kuten 1p""" tila["jannite"] = ik.lue_kentan_sisalto(jannite_kentta) jannite = tila["jannite"][0:-1] yksikko = tila["jannite"][-1] while True: try: if tila["jannite"] == "0": raise(ValueError) else: pass jannite == int(jannite) except ValueError: ik.avaa_viesti_ikkuna("Virhe", "Et antanut kelvollista jännitettä!", virhe=False) return aseta_jannite for yksikko in SI_kerrannaisyksikot: U = jannite * SI_kerrannaisyksikot.get("yksikko") #U = jannite if False: ik.avaa_viesti_ikkuna("Virhe", "Et antanut kelvollista jännitettä!\nVinkki: Anna jännite ilman yksikköä, esim. muodossa 12.0k", virhe=False) else: pass arvot["U"] = U pi.piirra_jannitelahde(piirin_piirto_tila, arvot["U"], arvot["f"], v_asetteluvali=2) ik.tyhjaa_kentan_sisalto(jannite_kentta)
def valitse_tyyppi(): """ Tarkastaa syötteestä, mitä tyyppiä komponentti on """ tyyppi = ik.lue_kentan_sisalto(tila["syote"]) ik.tyhjaa_kentan_sisalto(tila["syote"]) if tyyppi.isdigit(): ik.avaa_viesti_ikkuna( "VIRHE", "Komponentti voi olla vastus(r), kela(l) tai kondensaattori(c)!", True) elif len(tyyppi) > 1: if tyyppi == 'aasisvengaa': ik.avaa_viesti_ikkuna("Vanha vitsi!", "Aasi ei svengaa.", True) ik.avaa_viesti_ikkuna( "VIRHE", "Komponentti voi olla vastus(r), kela(l) tai kondensaattori(c)!", True) elif tyyppi == 'r' or 'l' or 'c': tallenna_tyyppi(tyyppi) else: ik.avaa_viesti_ikkuna( "VIRHE", "Komponentti voi olla vastus(r), kela(l) tai kondensaattori(c)!", True)
def tarkista_syotteet(): """ Tarkistaa syötteet. Jos syötteet kelpaa, käynnistää pelin. """ try: kentan_tiedot["korkeus"] = abs(int(ikkunasto.lue_kentan_sisalto(syotteet["korkeus"]))) kentan_tiedot["leveys"] = abs(int(ikkunasto.lue_kentan_sisalto(syotteet["leveys"]))) kentan_tiedot["miinojen_lkm"] = abs(int(ikkunasto.lue_kentan_sisalto(syotteet["miinojen_lkm"]))) except ValueError: ikkunasto.avaa_viesti_ikkuna( "Virhe", "Anna kentän leveydeksi ja korkeudeksi sekä miinojen lukumääräksi jokin positiivinen \ kokonaisluku.", True ) else: main()
def nimi(): '''Tallentaa sen nimen''' stats['nimi'] = iku.lue_kentan_sisalto(elementit['vika']) iku.tyhjaa_kentan_sisalto(elementit['vika']) iku.piilota_ali_ikkuna(elementit['vikaik']) ali = iku.luo_ali_ikkuna('') liput['save'] = True iku.luo_tekstirivi(ali, 'Tulokset tallennettu!')
def arvo_kasittelija(): '''Funktio hakee ja tarkistaa pelaajan antaman arvon. Kentta on tekstikenttä johon käyttäjä kirjoittaa, teksti alue johon kirjoitetaan tekstiä.''' try: peli["korkeus"] = int(iku.lue_kentan_sisalto(elementit["korkeus"])) peli["leveys"] = int(iku.lue_kentan_sisalto(elementit["leveys"])) peli["miinat"] = int(iku.lue_kentan_sisalto(elementit["miinat"])) if peli["korkeus"] <= 0 or peli["leveys"] <= 0 or peli["miinat"] <= 0: iku.avaa_viesti_ikkuna("Virhe", "Arvojen täytyy olla suurempia kuin nolla", True) else: iku.tyhjaa_kentan_sisalto(elementit["leveys"]) iku.tyhjaa_kentan_sisalto(elementit["korkeus"]) iku.tyhjaa_kentan_sisalto(elementit["miinat"]) liput["peli"] = True iku.lopeta() except ValueError: iku.avaa_viesti_ikkuna("Virhe", "Arvojen täytyy olla kokonaislukuja", True)
def uusipeli(): """ Tarkistaa kentän tiedot ja luo uuden pelin lataamalla grafiikat ja alkutilan sekä luomalla peli-ikkunan ja hiiren käsittelijän. """ korkeus = ikkunasto.lue_kentan_sisalto(korkeuskentta) leveys = ikkunasto.lue_kentan_sisalto(leveyskentta) miinat = ikkunasto.lue_kentan_sisalto(miinalkmkentta) try: korkeus = int(korkeus) leveys = int(leveys) miinat = int(miinat) except ValueError: ikkunasto.kirjoita_tekstilaatikkoon( tekstilaatikko, "Anna kentän tiedot kokonaislukuina!") else: if miinat < 1 or korkeus < 1 or leveys < 1: ikkunasto.kirjoita_tekstilaatikkoon( tekstilaatikko, "Arvojen täytyy olla suurempia kuin 0!") elif korkeus > 25 or leveys > 45: ikkunasto.kirjoita_tekstilaatikkoon(tekstilaatikko, "Kenttä on liian suuri!") elif miinat >= leveys * korkeus: ikkunasto.kirjoita_tekstilaatikkoon(tekstilaatikko, "Liikaa miinoja!") else: ikkunasto.lopeta() tila["alku"] = True tila["vuorot"] = 0 tila["lippuja"] = 0 tila["miinat"] = miinat tila["voitto"] = False luo_kentta(leveys, korkeus) haravasto.lataa_kuvat("spritet") haravasto.luo_ikkuna( len(tila["kentta"][0]) * 40, len(tila["kentta"]) * 40) haravasto.aseta_piirto_kasittelija(piirra_kentta) haravasto.aseta_hiiri_kasittelija(kasittele_hiiri) haravasto.aloita()
def tallenna_tilastot(): """ Tallentaa tilastot tiedostoon """ nimi = ikkunasto.lue_kentan_sisalto(nimikentta) if not nimi: ikkunasto.kirjoita_tekstilaatikkoon(tallennus_ikkuna_laatikko, "Anna jokin nimimerkki") else: with open("tilastot.txt", "a+") as tiedosto: tiedosto.write("{},{},{},{},{},{},{},{}\n".format( nimi, tila["aloitusaika"], tila["peliaika"], tila["voitto"], tila["vuorot"], len(tila["kentta"][0]), len(tila["kentta"]), tila["miinat"])) ikkunasto.lopeta() main()
def aseta_taajuus(): """ Lukee liukulukuarvon syötekentästä ja asettaa sen piirin jännitelähteen taajuudeksi. """ try: tila["taajuus"] = ik.lue_kentan_sisalto(tila["syote"]) if tila["taajuus"][-1].isdigit(): ik.kirjoita_tekstilaatikkoon( tila["laatikko"], "Taajuus: {} Hz".format(float(tila["taajuus"]))) else: tila["taajuus"] = muuta_kerrannaisyksikko(tila["taajuus"]) ik.kirjoita_tekstilaatikkoon( tila["laatikko"], "Taajuus: {} Hz".format(float(tila["taajuus"]))) except TypeError: ik.avaa_viesti_ikkuna("VIRHE", "Syöte ei ollut kelvollinen", True) ik.tyhjaa_kentan_sisalto(tila["syote"])
def lisaa_kela(): """Pyytää annettavan kelan tiedot""" tila["kelat"] = ik.lue_kentan_sisalto(kela_kentta) while True: try: arvo_kela = tila["kelat"][0:-1] except ValueError: ik.avaa_viesti_ikkuna("Virhe", "Et antanut kelvollista arvoa!\nVinkki: Anna arvo ilman yksikköä, esim. muodossa 12.0k", virhe=False) return lisaa_kela else: if tila["kelat"] == "0": raise(ValueError) elif not SI_kerrannaisyksikot.get("yksikko"): ik.avaa_viesti_ikkuna("Virhe", "Et antanut kelvollista arvoa!\nVinkki: Anna arvo ilman yksikköä, esim. muodossa 12.0k", virhe=False) return lisaa_kela yksikko = tila["kelat"][-1] L = arvo_kela * SI_kerrannaisyksikot.get("yksikko") arvot["L"] = L
def lisaa_vastus(): """Pyytää annettavan vastuksen tiedot""" tila["vastukset"] = ik.lue_kentan_sisalto(vastus_kentta) while True: try: arvo_vastus = tila["vastukset"][0:-1] except ValueError: ik.avaa_viesti_ikkuna("Virhe", "Et antanut kelvollista arvoa!\nVinkki: Anna arvo ilman yksikköä, esim. muodossa 12.0n", virhe=False) return lisaa_vastus else: if tila["vastukset"] == "0": raise(ValueError) elif not SI_kerrannaisyksikot.get("yksikko"): ik.avaa_viesti_ikkuna("Virhe", "Et antanut kelvollista arvoa!\nVinkki: Anna arvo ilman yksikköä, esim. muodossa 12.0n", virhe=False) return lisaa_vastus yksikko = tila["vastukset"][-1] R = arvo_vastus * SI_kerrannaisyksikot.get("yksikko") arvot["R"] = R
def asetaTaajuus(): """ Lukee syötekenttää ja koettaa asettaa taajuuden. """ taajuusTulokas = ikn.lue_kentan_sisalto(KLIITTYMÄ["syote"[1]]).strip() # Muunnos SI yksikköön. Tarkistaa myös syötteen kelvollisuuden. Jos ei kelvollinen, # palauttaa "None" arvon. taajuusTulokas = sim.muunnaSi(taajuusTulokas) if taajuusTulokas: KLIITTYMÄ["taajuus"] = taajuusTulokas tulostus = sim.Si_ksi(taajuusTulokas) ikn.kirjoita_tekstilaatikkoon( KLIITTYMÄ["logi"], "Taajuus: {}{} Hz".format(tulostus[0], tulostus[1])) else: ikn.avaa_viesti_ikkuna("Virhe!", "Syöte ei ollut kelvollinen.", True) ikn.tyhjaa_kentan_sisalto(KLIITTYMÄ["syote"[1]])
def muuta_osoitinmuotoon(): """Lukee kompleksiluvun syötekentästä ja muuttaa sen osoitinmuotoon, jossa osoittimen kulma on esitetty asteina. Kompleksiluku sekä sen osoitinmuoto tulostetaan käyttöliittymässä olevaan tekstilaatikkoon.""" elementit["tekstikentta"] = ik.lue_kentan_sisalto(tekstikentta) luku = elementit["tekstikentta"] luku = complex(" ".join(luku.split())) try: isinstance(luku, complex) except ValueError: ik.avaa_viesti_ikkuna("Virhe", "Et antanut kelvollista kompleksilukua!", virhe=False) return muuta_osoitinmuotoon else: napakoordinaatti = cmath.polar(luku) kulma = math.degrees(napakoordinaatti[1]) return napakoordinaatti[0], kulma tulosta_muutettu_kompleksiluku( napakoordinaatti, kulma ) #returnin jälkeen ei suoriteta enää mitään. Tänne on turha laittaa mitään
def aseta_taajuus(): """Pyytää käyttäjältä taajuuden. Oltava nollaa suurempi. """ tila["taajuus"] = ik.lue_kentan_sisalto(taajuus_kentta) taajuus = tila["taajuus"][0:-1] yksikko = tila["taajuus"][-1] while True: try: if tila["taajuus"] == "0": raise(ValueError) else: pass except ValueError: ik.avaa_viesti_ikkuna("Virhe", "Et antanut kelvollista taajuutta!\nVinkki: Anna taajuus ilman yksikköä, esim. muodossa 12.0k", virhe=False) return aseta_taajuus for yksikko in SI_kerrannaisyksikot: f = taajuus * SI_kerrannaisyksikot.get("yksikko") #f = taajuus if False: ik.avaa_viesti_ikkuna("Virhe", "Et antanut kelvollista taajuutta!\nVinkki: Anna taajuus ilman yksikköä, esim. muodossa 12.0k", virhe=False) else: pass arvot["f"] = f
def laske_arvo(): """ Laskee impedanssin eri komponenttityypeille, tallentaa ne sanakirjan komponentit-listaan ja kutsuu piirtämisfunktiota """ try: arvo = float(ik.lue_kentan_sisalto(tila["syote"])) tyyppi = tila["tyyppi"] ik.tyhjaa_kentan_sisalto(tila["syote"]) if tyyppi == 'r': ik.kirjoita_tekstilaatikkoon( tila["laatikko"], "Vastuksen impedanssi on {ohmi:.2f} ohmia.".format(ohmi=arvo)) tila["komponentit"].append((tyyppi, arvo)) tila["impedanssit"].append(arvo) piirra_piiri() elif tila["tyyppi"] == 'l': impedanssi = 2 * PI * tila["taajuus"] * arvo ik.kirjoita_tekstilaatikkoon( tila["laatikko"], "Kelan induktanssi taajuudella {hertsi:.2f} Hz on {ohmi:.3f} ohmia." .format(hertsi=tila["taajuus"], ohmi=impedanssi)) tila["komponentit"].append((tyyppi, impedanssi)) tila["reaktanssit"].append(impedanssi) piirra_piiri() elif tila["tyyppi"] == 'c': impedanssi = 1 / (2 * PI * float(tila["taajuus"]) * arvo) ik.kirjoita_tekstilaatikkoon( tila["laatikko"], "Kondensaattorin kapasitanssi taajuudella {hertsi:.2f} Hz on {ohmi:.3f} ohmia." .format(hertsi=tila["taajuus"], ohmi=impedanssi)) tila["komponentit"].append((tyyppi, impedanssi)) tila["reaktanssit"].append(impedanssi) piirra_piiri() except ValueError: ik.avaa_viesti_ikkuna("VIRHE", "Syötä liukuluku!", True)