Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Tkinter+arvaaja esimerkki

JesseT [09.06.2011 17:08:27]

#

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.

Mizou [09.06.2011 18:09:36]

#

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

jalski [10.06.2011 16:27:26]

#

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.

JesseT [10.06.2011 19:32:18]

#

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()

Metabolix [10.06.2011 19:46:46]

#

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")

JesseT [10.06.2011 22:19:03]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta