Problems with Python Frames

Asked

Viewed 160 times

2

I’m doing a college paper, and I’m having a hard time messing with Frames, more precisely I need to construct the graph below.

In the code, you walk through it from commands EAST, WEST, NORTH and SOUTH, but for example when I’m on point 3 and give command EAST, he’s going to the point 9 and I don’t know why and I can’t find the error in the code.

Grafo

from tkinter import *

class Shakespeare:
    cont1=0
    pontos=0
    comando=''
    quarto=0
    flag7=0
    dvivo=0

    def __init__(self):
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        self.quarto1()

    def saiu_do_sete(self):
        if(Shakespeare.flag7==1):
            self.msg = Label(self.c, text='Há um emblema na parede, rasgado, como se o fogo houvesse arrancado o olho de um animal')
        Shakespeare.flag7=0   

    def quarto1(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        self.saiu_do_sete()
        Shakespeare.quarto=1
        Shakespeare.cont1+=1
        self.msg =Label(self.c,text='Já é noite e você finalmente encontra abrigo em uma caverna escura'
                        ' e fria. Após explorá-la por algum tempo, você encontra um caldeirão fumegando. Ao estalo de um trovão, três bruxas surgem diante de você.')
        self.msg.pack()       
        if(Shakespeare.cont1==1):
            self.msg =Label(self.c,text='As bruxas falam eu uma só voz: \n\n'
                            'Mortal, te convocamos, deixe de lado o medo!\n'
                            'Apressa-te em tua missão, não sede hesitante.\n'
                            'Ache olhos de salamandra e sapo, um dedo\n'
                            'E os jogue aqui nesse caldeirão fumegante!\n\n'
                            'E mais: asas da coruja que aqui ousava voar,\n'
                            'Perna de lagarto e pelo de gato Angara.\n'
                            'Essas coisas precisamos para o feitiço lançar!\n'
                            'Rápido, nos traga e mal nenhum te abaterá\n\n'
                            'Pois agora nos deixe e vá embora.\n'
                            'Nada mais temos a dizer no momento\n'
                            'A não ser te avisar que lá fora\n'
                            'Um dragão pode ser o teu tormento!')
            self.msg.pack()
        else:
            Shakespeare.pontos+=1
            self.msg = Label(self.c, text='As bruxas estão diante de você, com olhos arregalados, esperando que lhes dê algo. '
                             'Os sons da noite parecem lhe avisar que não é seguro neste lugar continuar.')
            self.msg.pack()
        self.msg= Label(self.c, text='Você pode ir ao NORTE, SUL, LESTE ou OESTE')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()

    def ok(self):
        Shakespeare.comando=self.e.get()
        if(Shakespeare.quarto==7):
            Shakespeare.flag7=1

        if Shakespeare.comando=="NORTE" or Shakespeare.comando=="SUL" or Shakespeare.comando=="LESTE" or Shakespeare.comando=="OESTE":
            self.ir_para(Shakespeare.comando)

    def ir_para(self,comando):
        print(Shakespeare.quarto, comando)

        if(Shakespeare.quarto==1 and comando=="NORTE"):
            self.quarto3()
        if(Shakespeare.quarto==1 and comando=="SUL"):
            self.quarto8()
        if(Shakespeare.quarto==1 and comando=="OESTE"):
            self.quarto5()
        if(Shakespeare.quarto==1 and comando=="LESTE"):
            self.quarto6()

        if(Shakespeare.quarto==2 and comando=="OESTE"):
            self.quarto2()
        if(Shakespeare.quarto==2 and comando=="SUL"):
            self.quarto2()
        if(Shakespeare.quarto==2 and comando=="LESTE"):
            self.quarto3()

        if(Shakespeare.quarto==3 and comando=="SUL"):
            self.quarto1()        
        if(Shakespeare.quarto==3 and comando=="LESTE"):
            self.quarto4()
        if(Shakespeare.quarto==3 and comando=="OESTE"):
            self.quarto2()              

        if(Shakespeare.quarto==4 and comando=="LESTE"):
            self.quarto6()
        if(Shakespeare.quarto==4 and comando=="SUL"):
            self.quarto6()

        if(Shakespeare.quarto==5 and comando=="LESTE"):
            self.quarto1()
        if(Shakespeare.quarto==5 and comando=="OESTE"):
            self.quarto7()           

        if(Shakespeare.quarto==6 and comando=="LESTE"):
            self.quarto9()
        if(Shakespeare.quarto==6 and comando=="OESTE"):
            self.quarto1()
        if(Shakespeare.quarto==6 and comando=="NORTE"):
            self.quarto4()
        if(Shakespeare.quarto==6 and comando=="SUL"):
            self.quarto8()            

        if(Shakespeare.quarto==7 and comando=="NORTE"):
            self.quarto2()
        if(Shakespeare.quarto==7 and comando=="OESTE"):
            self.quarto5()

        if(Shakespeare.quarto==8 and comando=="LESTE"):
            self.quarto6()

        if(Shakespeare.quarto==9 and comando=="NORTE"):
            self.quarto6()
        if(Shakespeare.quarto==9 and comando=="OESTE"):
            self.quarto10()            

        if(Shakespeare.quarto==10 and comando=="LESTE"):
            self.quarto9()

    def quarto2(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        Shakespeare.quarto=2
        Shakespeare.pontos+=1
        self.msg = Label(self.c, text='Q2 Você voltou no tempo... Parece estar em um castelo medieval na Europa no século XIV.\n\n'
                         'Há brasões e emblemas nas paredes cheias de mofo. Em um dos emblemas, você vê o que parece ser um animal no meio do fogo.'
                         ' Abaixo uma inscrição diz "vulcani" e, mais abaixo, "Paracelso". Por um momento, o animal parece estar olhando em seus olhos.\n'
                         'Você pode ir ao SUL, LESTE ou OESTE')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()  


    def quarto3(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        Shakespeare.quarto=3
        Shakespeare.pontos+=1
        self.msg = Label(self.c, text='Q3 Um mundo, um paradigma, a sociedade, cachorros, aviões, mortes, cachorros-quente, viagens, alucinógenos\n'
                         'Você pode ir ao SUL, LESTE ou OESTE ')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()        

    def quarto4(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        Shakespeare.quarto=4
        Shakespeare.pontos+=1
        self.msg = Label(self.c,text='Q4 Ventos fortes, ventos fracos, ventos, ventanias, vendavais, vendas\n'
                         'Você pode ir ao SUL ou LESTE')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()

    def quarto5(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        Shakespeare.quarto=5
        Shakespeare.pontos+=1
        self.msg = Label(self.c,text='Q5 Hoje, mas não amanhã, somente hoje, eu irei, mas somente se não chover, porque senão não fará sol, então'
                         ' haveria de ser amanhã, mas hoje será o que ontem não foi\n'
                         'Você pode ir ao LESTE ou OESTE ')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()

    def quarto6(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        Shakespeare.quarto=6
        Shakespeare.pontos+=1
        self.msg = Label(self.c,text='Q6 O demônio, números, bodes, bandeiras esquisitas, Guiné e a socideade, tudo a mesma coisa, só que diferente\n'
                         'Você pode ir ao NORTE, SUL, LESTE ou OESTE ')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()

    def quarto7(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        Shakespeare.quarto=7
        Shakespeare.pontos+=1
        self.msg = Label(self.c,text='Q7 Você se encontra em um lugar onde o grupo Monty Python está encenando o "Sapo Crocante".'
                         ' Você olha para um confeiteiro que logo lhe diz: "Se eu tirar os ossos, eles não vão ser mais crocantes,'
                         ' né?" Você então vê uma caixa de chocolate onde está escrito "Sapos Crocantes". Ela parece conter uma dúzia'
                         ' de sapos inteiros, cuidadosamente cobertos pelo melhor chocolate.\n'
                         'Você pode ir ao NORTE ou OESTE ')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()

    def quarto8(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        Shakespeare.quarto=8
        Shakespeare.pontos+=1
        self.msg = Label(self.c,text='Q8 Uma porta, somente uma porta que pode ser aberta, irei morrer agora? Ou será só o reinício dessa história?\n'
                         'Você pode ir ao LESTE')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()

    def quarto9(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        Shakespeare.quarto=9
        Shakespeare.pontos+=1
        self.msg = Label(self.c,text='Q9\n'
                         'Você pode ir ao NORTE ou OESTE ')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()

    def quarto10(self):
        self.c.destroy()
        self.c=Frame(w, width=500, height=500)
        self.c.pack()
        Shakespeare.quarto=10
        Shakespeare.pontos+=1
        self.msg = Label(self.c,text='Q10 Você está em uma cozinha. Você então vê, ao fundo, um cozinheiro colocando uma porção de atum em uma'
                         ' panela. \nApesar de não ter certeza, parece haver uma espingarda ao lado do fogão. Há pelos brancos voando por todo lado,'
                         ' enquanto o cozinheiro parece falar sozinho: "Impossível trabalhar com todos estes gatos aqui...\n'
                         'Você pode ir ao LESTE')
        self.msg.pack()
        self.e = Entry(self.c)
        self.e.pack()
        self.b=Button(self.c,text="OK",command=self.ok)
        self.b.pack()

w=Tk()
app = Shakespeare()
w.mainloop()

1 answer

1


Initially the room number is 1.

def quarto1(self):
    # ...
    Shakespeare.quarto=1
    # ....

In the first Frame which is displayed if you type EAST, in the method ir_para, the line below is executed:

if(Shakespeare.quarto == 1 and comando == "LESTE"):
    self.quarto6()

In the method quarto6 the value of the variable Shakespeare.quarto is amended:

def quarto6(self):
    # ...
    Shakespeare.quarto = 6
    # ....
    self.b = Button(self.c, text="OK", command = self.ok)

On completion of the execution of the method quarto6 the variable Shakespeare.quarto is of value 6.

The method ir_para will continue its execution, that’s where the problem might be, as the command is EAST and the room is now 6, soon the reason you’re going to the point 9 is:

if(Shakespeare.quarto == 6 and comando == "LESTE"):
    self.quarto9()

You enter the room X, alters to X the value of Shakespeare.quarto and continues with the execution of the method ir_para. One way to fix this is to put a return after calling the other function:

 if(Shakespeare.quarto == 1 and comando == "LESTE"):
     self.quarto6()
     return

It is also necessary to do the same in other parts of the code showing such behaviour.

Another way is to put the code in a block while and use the break to stop the execution:

def ir_para(self,comando):
    print(Shakespeare.quarto, comando)

    while True:
        if(Shakespeare.quarto==1 and comando=="NORTE"):
            self.quarto3()
            break
        if(Shakespeare.quarto==1 and comando=="SUL"):
            self.quarto8()
            break
        # ...
        # ....
        # .....
  • Thank you so much, bro, really missed this mistake, vlw!!!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.