Tengo un extraño error

Buenas, estoy programando (por primera vez en mi vida) un juego de preguntas y respuestas para un proyecto final de mi universidad.
Sin embargo, me surge un problema al hacer el cambio de boton. Ya que deberia eliminarse, pero a veces (sin ninguna razon visible) los botones no se borran.
Dejo el codigo por si alguno puede ver mas de lo que yo veo.

# coding: utf-8
import pilasengine
import random
pilas = pilasengine.iniciar()

def ayuda():
   bombero.decir("Selecciona inicio para comenzar el juego\nLuego aparecera una pregunta con 3 respuestas en pantalla\ncontesta correctamente todas las preguntas para ganar!!",False)
   
soundtracki=pilas.musica.cargar("Su turno.ogg")
soundtracki.reproducir(True)
nombre=raw_input("Ingrese su nombre")
fondoi=pilas.fondos.Fondo()
fondoi.imagen=pilas.imagenes.cargar("fondos/PROJECT Q.png")
bombero=pilas.actores.Actor(imagen="elbombero.png")
bombero.escala_x=0.25
bombero.escala_y=0.25
bombero.y=-150
bombero.x=150
bombero.decir("Hey hola "+nombre+"\nSi necesistas ayuda haz click sobre mi")
bombero.set_cuando_hace_click(ayuda)

def comenzar():
   i=0  
   pilas.escenas.Normal()
   soundtrack=pilas.musica.cargar("Blues.ogg")
   soundtrack.reproducir(True)
   pilas.fondos.Tarde()
   p=pilas.actores.Puntaje()
   p.x=200
   p.y=-200
   lista=[[(u"Quien debe realizar una instalacion de gas?"),(u"Gasista sin matricula"),(u"Gasista matriculado"),(u"Cualquiera persona"),2],[(u"El funcionamiento de los artefactos de gas,se verifica:"),(u"Periodicamente"),(u"Solo al instalarse"),(u"Solo si hay perdidas"),1],[(u"Quien puede modificar una instalacion?"),(u"Cualquiera"),(u"Gasista sin matricula"),(u"Gasista matriculado"),3],[(u"La llama de un quemador de gas de ser:"),(u"Amarilla"),(u"Azul"),(u"Anaranjado"),2],[(u"Durante sencias prolongadas"),(u"Cerrar llaves de gas"),(u"Dejar abiertas llaves de gas"),(u"Es indistinto"),1],[(u"Los conductos de evacuacion de gases deben ser"),(u"Sin salida al exterior"),(u"Salida a los cuatro vientos"),(u"Ninguna de las anteriores"),2],[(u"En ambientes cerrados los artefactos deben ser"),(u"Tiro natural"),(u"Tipo infrarrojo"),(u"Tiro balanceado"),3],[(u"En ambiente con artefacto de tiro natural el lugar debe estar:"),(u"Cerrado"),(u"Ventilado siempre"),(u"Es distinto"),2],[(u"Para calefacionar se usa"),(u"Hornalla"),(u"Horno"),(u"Calefactor de tiro balanceado"),3],[(u"Con el quemador a maxima potencia la llama es"),(u"Estable"),(u"Fluctua su dimension"),(u"Inestable"),1],[(u"Si sentis olor a gas,no:"),(u"Abras puertas y ventanas"),(u"Enciendas luces"),(u"Cierres llaves de gas"),2]]
   random.shuffle(lista)
   
   def cambio_de_boton(lista, i):
       botonr1=pilas.interfaz.Boton(x=350, y=100,texto=str(lista[i][1]))
       botonr1.x=[150,150]
       botonr2=pilas.interfaz.Boton(x=350, y=50,texto=str(lista[i][2]))
       botonr2.x=[150,150]
       botonr3=pilas.interfaz.Boton(x=350, y=0,texto=str(lista[i][3]))
       botonr3.x=[150,150]
       pregunt=pilas.actores.Texto(str(lista[i][0]))
       pregunt.x=[-300,-100]
       pregunt.y=150
       
       def comparador(textoboton,lista,i):
            indice=lista[i].index(textoboton)
           
            if indice==lista[i][4]:
               pilas.avisar("correcto")
               p.aumentar(10)
               
            else:
               pilas.avisar("Incorrecto")
               p.aumentar(-5)
              
            botonr1.eliminar()
            botonr1.x=10000
            botonr2.eliminar()
            botonr2.x=10000
            botonr3.eliminar()
            botonr3.x=10000
            pregunt.eliminar()
            pregunt.x=100000
            if i<=11:                
             cambio_de_boton(lista,i+1)
            else:
               pilas.avisar("FIN")
                           
       def boton_tocado1():
           textoboton1=botonr1.texto
           comparador(textoboton1,lista,i)
       def boton_tocado2():
           textoboton2=botonr2.texto
           comparador(textoboton2,lista,i)
       def boton_tocado3():
           textoboton3=botonr3.texto
           comparador(textoboton3,lista,i)
       botonr1.conectar(boton_tocado1)
       botonr2.conectar(boton_tocado2)
       botonr3.conectar(boton_tocado3)
       
   
   cambio_de_boton(lista,i)
   print (lista)
   	
   
   
def salir():
   pilas.terminar()
   
Menu=pilas.actores.Menu([('Inicio', comenzar),('salir', salir),])
Menu.x=-200
pilas.ejecutar()

Hola @Zack_Farias, No llegué a revisar muy bien el código, pero me da la sensación que las variables de botones se deberían declarar como globales, porque sino, cada vez que se llame a la función cambio_de_boton se van a volver a generar botones nuevos.

Este es el código que usé para probar si se trataba de eso. observá que puse algunas lineas que dicen “global …” debajo de la función “cambio_de_boton”. Es lo único que tendrías que cambiar para que funcione si estoy en lo cierto. Cambié otras cosas porque no tenía las imágenes y no me cargaba.

# coding: utf-8
import pilasengine
import random
pilas = pilasengine.iniciar()

def ayuda():
   bombero.decir("Selecciona inicio para comenzar el juego\nLuego aparecera una pregunta con 3 respuestas en pantalla\ncontesta correctamente todas las preguntas para ganar!!",False)
   
#soundtracki=pilas.musica.cargar("Su turno.ogg")
#soundtracki.reproducir(True)
nombre=raw_input("Ingrese su nombre")
fondoi=pilas.fondos.Fondo()
#fondoi.imagen=pilas.imagenes.cargar("fondos/PROJECT Q.png")
fondoi.imagen=pilas.imagenes.cargar("mono.png")

#bombero=pilas.actores.Actor(imagen="elbombero.png")
bombero=pilas.actores.Actor(imagen="mono.png")

bombero.escala_x=0.25
bombero.escala_y=0.25
bombero.y=-150
bombero.x=150
bombero.decir("Hey hola "+nombre+"\nSi necesistas ayuda haz click sobre mi")
bombero.set_cuando_hace_click(ayuda)

def comenzar():
   i=0  
   pilas.escenas.Normal()
   #soundtrack=pilas.musica.cargar("Blues.ogg")
   #soundtrack.reproducir(True)
   pilas.fondos.Tarde()
   p=pilas.actores.Puntaje()
   p.x=200
   p.y=-200
   lista=[[(u"Quien debe realizar una instalacion de gas?"),(u"Gasista sin matricula"),(u"Gasista matriculado"),(u"Cualquiera persona"),2],[(u"El funcionamiento de los artefactos de gas,se verifica:"),(u"Periodicamente"),(u"Solo al instalarse"),(u"Solo si hay perdidas"),1],[(u"Quien puede modificar una instalacion?"),(u"Cualquiera"),(u"Gasista sin matricula"),(u"Gasista matriculado"),3],[(u"La llama de un quemador de gas de ser:"),(u"Amarilla"),(u"Azul"),(u"Anaranjado"),2],[(u"Durante sencias prolongadas"),(u"Cerrar llaves de gas"),(u"Dejar abiertas llaves de gas"),(u"Es indistinto"),1],[(u"Los conductos de evacuacion de gases deben ser"),(u"Sin salida al exterior"),(u"Salida a los cuatro vientos"),(u"Ninguna de las anteriores"),2],[(u"En ambientes cerrados los artefactos deben ser"),(u"Tiro natural"),(u"Tipo infrarrojo"),(u"Tiro balanceado"),3],[(u"En ambiente con artefacto de tiro natural el lugar debe estar:"),(u"Cerrado"),(u"Ventilado siempre"),(u"Es distinto"),2],[(u"Para calefacionar se usa"),(u"Hornalla"),(u"Horno"),(u"Calefactor de tiro balanceado"),3],[(u"Con el quemador a maxima potencia la llama es"),(u"Estable"),(u"Fluctua su dimension"),(u"Inestable"),1],[(u"Si sentis olor a gas,no:"),(u"Abras puertas y ventanas"),(u"Enciendas luces"),(u"Cierres llaves de gas"),2]]
   random.shuffle(lista)
   
   def cambio_de_boton(lista, i):
       global botonr1      
       global botonr2
       global botonr3  
       botonr1=pilas.interfaz.Boton(x=350, y=100,texto=str(lista[i][1]))
       botonr1.x=[150,150]
       botonr2=pilas.interfaz.Boton(x=350, y=50,texto=str(lista[i][2]))
       botonr2.x=[150,150]
       botonr3=pilas.interfaz.Boton(x=350, y=0,texto=str(lista[i][3]))
       botonr3.x=[150,150]
       pregunt=pilas.actores.Texto(str(lista[i][0]))
       pregunt.x=[-300,-100]
       pregunt.y=150
       
       def comparador(textoboton,lista,i):
            indice=lista[i].index(textoboton)
           
            if indice==lista[i][4]:
               pilas.avisar("correcto")
               p.aumentar(10)
               
            else:
               pilas.avisar("Incorrecto")
               p.aumentar(-5)
              
            botonr1.eliminar()
            botonr1.x=10000
            botonr2.eliminar()
            botonr2.x=10000
            botonr3.eliminar()
            botonr3.x=10000
            pregunt.eliminar()
            pregunt.x=100000

            if i < len(lista):                
             cambio_de_boton(lista,i+1)
            else:
               pilas.avisar("FIN")
                           
       def boton_tocado1():
           textoboton1=botonr1.texto
           comparador(textoboton1,lista,i)
       def boton_tocado2():
           textoboton2=botonr2.texto
           comparador(textoboton2,lista,i)
       def boton_tocado3():
           textoboton3=botonr3.texto
           comparador(textoboton3,lista,i)
        
       botonr1.conectar(boton_tocado1)
       botonr2.conectar(boton_tocado2)
       botonr3.conectar(boton_tocado3)
       
   
   cambio_de_boton(lista,i)
   print (lista)
   	
   
   
def salir():
   pilas.terminar()
   
Menu=pilas.actores.Menu([('Inicio', comenzar),('salir', salir),])
Menu.x=-200
pilas.ejecutar()

Por cierto, luego me saltaron algunos errores como este:

supongo que debe ser por otro motivo, pero cualquier cosa consultanos.

Abrazo!

Buenas, @Zack_Farias !

Da un poco de miedo responder después que lo haga @hugoruscitti, pero bueno, se hace con buena intención y esperando estar a la altura :smile:

He testado tu juego con las reformas que le hizo Hugo y a mí me funciona bastante bien, salvo 3 pequeños fallos:

  • Me dió problemas el “raw_input”, se me quedaba colgado! Se solucionó al desplazarlo debajo de la línea que define el fondo.

  • Cuando se acababan las preguntas me daba error de indice de lista. Eso es por que el len(lista) devuelve un número menor que el largo de la lista. Se solucionó añadiendo un -1 al len(lista):

if i < len(lista)-1:
    cambio_de_boton(lista,i+1)
else:
    pilas.avisar("FIN")
  • El tercero, que la mayoría de los textos quedaban escondidos a la izquierda y no se podían leer. Esto se solucionó añadiendo saltos de línea en las preguntas:
u"Quien debe realizar \nuna instalacion de gas?"

Un saludo! :wink: