Olen yrittänyt tehdä GUI:ta python ohjelmalle tkinterillä.
Ohjelmani on samantyyppinen kuin 3. python oppaassa esitetty arvaaja, mutta se arvaa kuukauden maksimissaan 4 kysymyksellä. Ongelma on se, että en onnistu saamaan noita sisäkkäisiä if-rakenteita toimimaan, jos kysymyksiin vastataan Checkbuttoneilla. Onko tämmöinen rakenne edes mahdollista saada toimimaan tuolla tavoin, vai pitääkö se tehdä jotain muuta kautta. Jos joku voisi kertoa miten sen saa toimimaan tai käyttää tuota oppaan arvaajan koodia ja kirjoittaa esimerkki ohjelman.Komentorivillä ohjelma toimii hyvin.
Koodinpätkäsi voisi auttaa vian etsimisessä tai esimerkin teossa kuten myös Python versio (ilmeisesti matalampi kuin 2.7).
Edit:
Niin viellä lisäys että pitäisi olla mahdollinen.
Muokkasimpas viellä hieman omien sekoilujeni takia.
Tämä voi auttaa:
http://effbot.org/tkinterbook/checkbutton.htm
Kerropas vielä tuosta haluamastasi toteutuksesta. Onko käyttöliittymässäsi kaikki kysymykset kerralla näkyvillä ja näihin vastataan checkbuttoneilla? Vai näyttääkö se yhden kysymyksen kerrallaan ja siihen vastausvaihtoehdot?
Jälkimmäisessä tapauksessa radiobutton olisi checkbuttonia parempi valinta.
Tuon buttonin tilahan tallentuu aina muuttujaan, josta se on helppo tarkastaa ja Pythonin kanssa touhutessa voit muuten vähentää tuota if - vertailujen määrää muodostamalla merkkijonon ja liittämällä siihen noiden vastaus vaihtoehtojen checkbuttoneiden tilat (0 tai 1). Nyt jos sinulla on toisaalla tallennettuna merkkijonoon oikeiden vastauksien vastausvaihtoehtojen tilat, niin selviät yhdellä merkkijonovertailulla.
Elikkäs tällä hetkellä ensiksi tulee ohjeet ja valmis nappi. Kun valmisnappia painaa se poistaa kaiken muun ja tulostaa ensimmäinen kysymyksen,sekä kyllä ja ei checkbuttonit ja lue napin. Kun lue nappia painaa se tarkistaa arvon ja poistaa kyllä ja ei checkbuttonit ja sen jälkeen lisää ne uudestaan(en tiedä onko tämä tarpeen, vai voiko niiden tilan nollata jolllain muulla tavalla)
Jos kyllänappi on valittu se tulostaa eri kysymyksen, kuin jos einappi on valittu.Tämä jatkuu niin kauan kunnes ohjelma tulee siihen kohtaan if- rakennetta missä lukee mikä kuukausi on kyseessä. Kysymykset näkyvät yksi kerrallaan.
jalski tarkoititko tätä esim. tammikuu(0,1,0).Miten tallennus kannattaa tehdä, jos seuraava kysymys riippuu edellisen vastauksesta eli mahdollisia kysymyksiä on yhteensä 11
Mizou versio on 2.6.5
Olen vasta aloittanut ohjelmoinnin joten koodi ei ole mikään kaksinen. Se pysähtyy jo ekaan if:in sisäkkäiseen silmukkaan:
Syntax error: unexpected indent
Onko vain jostain kirjoitus virheestä vai rakenteesta?
#!/usr/bin/python # -*- coding: utf-8 -*- from tkinter import * import sys #ikkunan luonti ikkuna= Tk() ikkuna.title("Arvaaja") ikkuna.geometry("400x175") #kysymyksen osat alku = "Onko kuukauden nimessä " loppu = "-kirjain ?" #alkuteksti alkuteksti = Label(ikkuna, text = """Tämä on Arvaaja Ajattele jotain kuukautta Arvaan sen HUOM: Älä ota mukaan -kuu osaa vastatessasi kysymyksiin Esim: marraskuu --> marras Oletko valmis?""") alkuteksti.pack() #Vastauksen tulostuksen määrittely tammikuu = Label(ikkuna, text = """Kuukausi on tammikuu""") helmikuu = Label(ikkuna, text = """Kuukausi on helmikuu""") maaliskuu = Label(ikkuna, text = """Kuukausi on maaliskuu""") huhtikuu = Label(ikkuna, text = """Kuukausi on huhtikuu""") toukokuu = Label(ikkuna, text = """Kuukausi on toukokuu""") kesakuu = Label(ikkuna, text = """Kuukausi on kesäkuu""") heinakuu = Label(ikkuna, text = """Kuukausi on heinäkuu""") elokuu= Label(ikkuna, text = """Kuukausi on elokuu""") syyskuu = Label(ikkuna, text = """Kuukausi on syyskuu""") lokakuu = Label(ikkuna, text = """Kuukausi on lokakuu""") marraskuu = Label(ikkuna, text = """Kuukausi on marraskuu""") joulukuu = Label(ikkuna, text = """Kuukausi on joulukuu""") virhe = Label(ikkuna, text = """VIRHE!""") #lopeta komento def lopeta(): ikkuna.destroy() sys.exit(0) #lopetanappi lopetanappi = Button(ikkuna, text = "Lopeta", command = lopeta) arvo1 = IntVar() kylla = Checkbutton(ikkuna, text = "Kyllä", variable = arvo1) arvo2 = IntVar() ei = Checkbutton(ikkuna, text =" Ei ", variable = arvo2) def lue(): if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti['text'] = alku + "o" + loppu kylla.destroy() ei.destroy() kylla1.pack() ei1.pack() luenappi.pack() #virhe tulee tässä ja se osoitttaa välilyöntiä if:n edessä if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti['text'] = alku + "e" + loppu kylla.destroy() ei.destroy() luenappi.destroy() kylla.pack() ei.pack() luenappi.pack() if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti.destroy() kylla.destroy() ei.destroy() elokuu.pack() lopetanappi.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti['text'] = alku + "j" + loppu kylla.destroy() ei.destroy() luenappi.destroy() kylla.pack() ei.pack() luenappi.pack() if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti.destroy() kylla.destroy() ei.destroy() luenappi.destroy() joulukuu.pack() lopetanappi.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti.destroy() kylla.destroy() ei.destroy() luenappi.destroy() lokakuu.pack() lopetanappi.pack() else: virhe.pack() else: virhe.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti['text'] = alku +"a" + loppu kylla.destroy() ei.destroy() luenappi.destroy() kylla.pack ei.pack() luenappi.pack() if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti.destroy() kylla.destroy() ei.destroy() luenappi.destroy() maaliskuu.pack() lopetanappi.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti.destroy() luenappi.destroy() kylla.destroy() ei.destroy() helmikuu.pack() lopetanappi.pack() else: virhe.pack() else: virhe.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti['text'] = alku + "t" + loppu kylla.destroy() ei.destroy() kylla1.pack() ei1.pack() luenappi.pack() if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti['text'] = alku + "u" + loppu luenappi.destroy() kylla.destroy() ei.destroy() kylla.pack() ei.pack() luenappi.pack() if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti['text'] = alku + "h" + loppu kylla.destroy() ei.destroy() luenappi.destroy() kylla.pack() ei.pack() luenappi.pack() if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti.destroy() kylla.destroy() luenappi.destroy() ei.destroy() huhtikuu.pack() lopetanappi.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti.destroy() luenappi.destroy() kylla.destroy() ei.destroy() toukokuu.pack() lopetanappi.pack() else: virhe.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti.destroy() ei.destroy() kylla.destroy() luenappi.destroy tammikuu.pack() lopetanappi.pack() else: virhe.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti['text'] = alku + "e" + loppu luenappi.destroy() ei.destroy() kylla.destroy() kylla.pack() ei.pack() luenappi.pack() if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti['text'] = alku + "k" + loppu kylla.destroy() luenappi.destroy() ei.destroy() kylla.pack() ei.pack() luenappi.pack() if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti.destroy() ei.destroy() kylla.destroy() luenappi.destroy() kesakuu.pack() lopetanappi.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti.destroy() ei.destroy() kylla.destroy() heinakuu.pack() lopetanappi.pack() else: virhe.pack() elif arvo1.get() == 0 and arvo2.get() == 1: alkuteksti['text'] = alku + "y" + loppu luenappi.destroy() kylla.destroy() ei.destroy() kylla.pack() ei.pack() luenappi.pack() if arvo1.get() == 1 and arvo2.get() == 0: alkuteksti.destroy() luenappi.destroy() ei.destroy() kylla.destroy() syyskuu.pack() lopetanappi.pack() elif arvo1.get() == 0 and arvo2.get() ==1: luenappi.destroy() alkuteksti.destroy() ei.destroy() kylla.destroy() marraskuu.pack() lopetanappi.pack() else: virhe.pack() else: virhe.pack() else: virhe.pack() else: virhe.pack() #luenappi luenappi = Button(ikkuna, text = "Lue", command = lue) #valmis määrittely def valmis(): alkuteksti['text'] = alku + "l" + loppu valmisnappi.destroy() kylla.pack() ei.pack() luenappi.pack() #Valmisnappi valmisnappi = Button(ikkuna, text = \ "Olen", command = valmis) valmisnappi.pack()
Ei varmaan olisi ollut ihan mahdotonta kirjoittaa virheilmoitusta hakukoneeseen.
unexpected = odottamaton
indent = sisennys
Peräkkäisillä riveillä pitää olla samanlainen sisennys (sama määrä välilyöntejä tai tabulaattoreita rivin alussa), paitsi silloin, kun tarkoituksella lisätään sisennystasoa (esim. if-lauseen sisällön merkkaamiseksi) tai vähennetään (esim. if-lauseen päättymisen merkiksi).
Oikein, if-lauseen sisällä print ja toinen if-lause:
if 1 < 2: print("1") if 3 < 4: print("2")
Väärin, koska toisen if-lauseen alku ei ole linjassa edellisen print-rivin kanssa:
if 1 < 2: print("1") if 3 < 4: print("2")
Eri asia, if-lauseen sisällä pelkkä print ja perässä toinen, täysin erillinen if-lause:
if 1 < 2: print("1") if 3 < 4: print("2")
Tiesin kyllä mitä tuo virheilmoitus tarkoitta,mutta tuota en tiennyt että sen pitää alkaa samalta riviltä.Kiitos! täytyy huomenna testata toimiiko koodi,kun tänään ei enään jaksa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.