import os
import sys
import marshal
import requests
import datetime
from datetime import date
from string import Template
pokemones = []
url_api=" http://pokeapi.co/api/v2/pokemon/"
class pokemon():
nombre = ""
tipo = ""
latitud = ""
longitud = ""
comida = ""
sangre = ""
ano = ""
mes = ""
dia = ""
edad = ""
signo = ""
foto = ""
try:
a = open("datos.pokemon","br")
tmp = marshal.load(a)
for z in tmp:
p = pokemon()
p.nombre = z[0]
p.tipo = z[1]
p.latitud = z[2]
p.longitud = z[3]
p.comida = z[4]
p.sangre = z[5]
p.ano = z[6]
p.mes= z[7]
p.dia = z[8]
p.edad = z[9]
p.signo = z[10]
p.foto = z[11]
pokemones.append(p)
a.close()
print("Hemos encontrador ", len(pokemones),"pokemones regristrado")
except:
print("No hay datos regristrados...")
def menu():
os.system("cls")
print("---------Bienvenido a la Pokedex--------")
print("1-Agregar pokemon")
print("2-Ver pokemon")
print("3-Reportes")
print("4-Exportar pokemon")
print("5-Exportar Mapa")
print("6-Exit")
tmp = input("Digite una opcion: ")
if (tmp =="1"):
agregarPokemon()
elif (tmp =="2"):
verPokemon()
elif (tmp =="3"):
reportes()
elif (tmp == "4"):
exportarPokemon()
elif (tmp == "5"):
exportarMapa()
elif(tmp =="6"):
datos = []
for p in pokemones :
t=[]
t.append(p.nombre)
t.append(p.tipo)
t.append(p.latitud)
t.append(p.longitud)
t.append(p.comida)
t.append(p.sangre)
t.append(p.ano)
t.append(p.mes)
t.append(p.dia)
t.append(p.edad)
t.append(p.signo)
t.append(p.foto)
datos.append(t)
a = open("datos.pokemon","bw")
marshal.dump(datos,a)
a.close()
print("Hasta la proxima")
sys.exit()
else:
print("Digite una opcion valida")
menu()
def agregarPokemon():
print("Vamos a agregar Pokemon")
p = pokemon()
nombre = input("Digite el nombre del pokemon:")
print("Estamos validando...")
url = url_api + nombre.lower()
response = requests.get(url)
if response.status_code == 200:
print("El pokemon que tenemos es:",nombre)
pass
data = response.json()
(data["types"])
types_pokemon = ",".join([t["type"]["name"]for t in data["types"]])
print("Su tipo es:")
types_pokemon = []
for t in data["types"]:
types_pokemon.append(t["type"]["name"])
for s in types_pokemon:
print(s)
if response.status_code == 404:
print("no lo encuentra")
print("digite un nombre valido")
p.nombre = nombre
print("Esta es la fecha de hoy")
p.tipo = s
hoy = datetime.date.today()
print(hoy.strftime('%d/%m/%Y'))
print("Ahora pon la fecha de nacimiento de pokemon")
p.ano = int(input("Digite su ano de nacimiento \n"))
p.mes = int (input("Digite su mes de nacimiento \n"))
p.dia = int(input("Digite su dia de nacimiento \n"))
d= date.today()
Calculando= (d.year)-(p.ano)
Calculando2= (Calculando)-1
if p.mes>d.month:
print("su edad es: "+str(Calculando2))
elif p.dia>d.day:
print("su edad es: "+str(Calculando2))
elif p.mes<=d.month:
print("su edad es: "+str(Calculando))
elif p.dia<=d.day:
print("su edad es: "+str(Calculando))
p.edad = input("Digite la edad que te muestra la pantalla \n")
print("Muy bien")
p.latitud = input("Digite su latitud \n")
p.longitud = input("Digite su longitud \n")
p.sangre = input("Digite su tipo de sangre \n")
p.comida = input("Digite su comida \n")
signo = ("capricornio", "acuario", "piscis", "aries", "tauro", "géminis", "cáncer", "leo", "virgo", "libra", "escorpio", "sagitario")
fechas = (20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 22, 21)
dia=p.dia
mes=p.mes
mes=mes-1
if dia>fechas[mes]:
mes=mes+1
if mes==12:
mes=0
print ("Tu signo zodiaco es: " + signo[mes])
p.signo = signo[mes]
pokemones.append(p)
input("Pokemon agregado,presione enter para volver a opcion")
menu()
def verPokemon():
print("Exixten",len(pokemones),"pokemon")
s = 1
for p in pokemones:
print("#--Nombre: ",p.nombre)
print("#--Latitud: ",p.latitud)
print("#--longitud: ",p.longitud)
print("#--Su fecha de nacimiento es: ",p.dia,"/",p.mes,"/",p.ano)
print("#--Su tipo de sangre es: ",p.sangre)
print("#--Su tipo de comida: ",p.comida)
print("#--Su edad es: ",p.edad)
print("#--El pokemon es de tipo: ",p.tipo)
print("#--Su signo zodiacal es: ",p.signo)
s +=1
print('Gracias por tu estadia aqui!')
input("Press enter para volver al menu")
menu()
def reportes():
print("Veremos los pokemones de mi sistema")
print("1-Pokemones por cumpleanos")
print("2-Pokemones por tipo")
print("3-Pokemones que comida")
opcion = input("Elige una opcion: ")
if (opcion == "1"):
cumpleanos()
elif (opcion == "2"):
tipo()
elif (opcion == "3"):
comida()
else:
print("Elige una opcion valida")
reportes()
def cumpleanos():
print("Aqui vamos a encontrar los pokemones que cumpleanos por mes")
ap = int(input("Digite el mes en numero: "))
for h in pokemones:
if ap == int(h.mes):
print("Nombre",h.nombre)
else:
pass
input("Precione enter para ir a menu principa")
menu()
def tipo():
if opcion=="2":
ti="electric"
cont=0
for x in pokemones:
if ti ==(x.tipo):
cont=cont+1
print("Hay:",cont,x.tipo)
else:
pass
menu()
def comida():
print("Aqui vamos a encontrar a los pokemones por comidas")
for pokemon in pokemones:
j = []
j.append(p.comida)
j.append(p.comida)
print(pokemon)
else:
pass
input("Precione enter para ir a menu principa")
menu()
def exportarPokemon():
filein = open("Template/Perfil.html")
src = Template(filein.read())
nombre = p.nombre
latitud = p.latitud
longitud = p.longitud
fecha_nac = p.dia,p.mes,p.ano
tipo_sang = p.sangre
tipo_com = p.comida
tipo = p.tipo
signo = p.signo
edad = p.edad
d={"nombre":nombre, "latitud":latitud, "longitud":longitud, "fecha_nac":fecha_nac,"edad":edad,
"tipo_sang":tipo_sang,"tipo_com":tipo_com,"tipo":tipo,"signo":signo,}
result = src.substitute(d)
try:
os.mkdir("Pokemones")
filein2 = open("pokemones/"+str(nombre)+".html", "w")
filein2.writelines(result)
print("Creando una carpeta")
print("Guardando archivo")
except OSError:
if os.path.exists("Pokemones"):
filein2= open("Pokemones"+".html", "a")
filein2.writelines(result)
print("guardando archivo")
while True:
question = input("Press S si quieres seguir y E si quieres salir")
if question == "S":
os.system("Combazoo.py")
elif question == "E":
sys.exit()
menu()
Asked
Active
Viewed 108 times
-1
Manuel Ramirrez
- 1
- 1
-
Hola Manuel, ¿podrías explicar un poco mejor que quieres decir con "lo imprime en binarios"? ¿Qué es lo que imprime? ¿la variable `pokemon`? ¿Podrías agregar la salida? Para empezar `p` no está definido y `print(pokemon)` te imprime la instancia, algo como `<__main__.pokemon at="" object="">`. Por cierto, no uses atributos de clase en tu clase `pokemon`, usa atributos de instancia que es lo que son en tu caso; [Diferencian entre atributos de instancia y atributos de clase](https://es.stackoverflow.com/q/132561/15089). – FJSevilla Jul 29 '18 at 20:57
-
Sii haci mismo me lo imprime – Manuel Ramirrez Jul 29 '18 at 21:02
-
Estos es lo que quiero que alga pero primero tengo que solucionar ese error... Ejemplo:En este reporte mostrara cada uno de los tipos de pokemon que existen en nuestro sistema y sus comidas favoritas. Ejemplo: Fire => Arroz con habichuela, moro, aguacate, etc. Whater => Sopa, Asopao, Sancocho, etc – Manuel Ramirrez Jul 29 '18 at 21:05
-
Estocen viene y me lo imprime haci <__main__.pokemon at="" object="">..Y no me deja proceder con el programa – Manuel Ramirrez Jul 29 '18 at 21:06
-
Con `for pokemon in pokemones` iteras sobre la lista `pokemones` (variable global) por lo que `pokemon` son objetos de la clase `pokemon` y al hacer `print(pokemon)` te muestra lo que toda instancia sin método `__str__` definido muestra, su clase y la dirección de memoria del objeto... Para que al hacer `print(objeto)` te imprima algo personalizado debes definir el método `__str__` en la clase, ¿Qué se supone que quieras que te imprima cuando haces `print(pokemon)`? Porque si fuera la comida, deberías hacer `print(pokemon.comida)` para que muestre el atributo... – FJSevilla Jul 29 '18 at 21:10
-
Entiendo... Por ejemplo, yo agregue varios pokemones tipo electric....Entoces en la comida favoriti, en uno puse carne y en el otro puse arroz. Y me va a imprimir = electric, arroz, carne – Manuel Ramirrez Jul 29 '18 at 21:13
-
¿Entonces lo que quieres es que te imprima los pokemons clasificados los por comida favorita? Es decir, si agrageste "Pikachu.comida=arroz", "Charizard.comida= carne", "Alakazam.comida=arroz", te mostrara algo como "arroz -> Pikachu, Alakazan | carne -> Charizard" – FJSevilla Jul 29 '18 at 21:27
-
No, lo que quiero hacer agruparlos por tipo y comida favorita, ejemplo:('electric', 'Cherry','carne','arroz') Entoces en ese ejemplo hay tres pokemones electric y su comida favortia – Manuel Ramirrez Jul 29 '18 at 21:30
-
Aun me dar el error ??? – Manuel Ramirrez Jul 29 '18 at 22:11
-
Deberías de escribir en SO (stack overflow) solamente el código mínimo para reproducir tu error/bug, no todo el programa/script/función. Esto es por dos motivos: 1- Leer tantisimo código da una pereza enorme porque no sabemos en qué parte te falla. Por mucho que lo expliques, hay demasiado que entender de todo ese código. 2- Al reducir el código al mínimo para enseñarnos donde falla, es muy probable que tú mismo veas el error. – Saelyth Jul 30 '18 at 09:19
2 Answers
0
Si cuando pides al actor que introduzca el tipo de comida en vez de input usas raw_input debería funcionar. Si no la otra opciones es en el print de la p.comida castear la variable a string con str(p.comida).
Espero que ayude saludos.
0
Asumo que te refieres a la función
def comida():
print("Aqui vamos a encontrar a los pokemones por comidas")
for pokemon in pokemones:
j = []
j.append(p.comida)
j.append(p.comida)
print(pokemon)
else:
pass
input("Precione enter para ir a menu principa")
menu()
En la línea print(pokemon)
al ser una instancia de una clase sin método __str__
o __repr__
te muestra solo su nombre de clase y su dirección de memoria (ubicación dentro de la memoria RAM del equipo donde se ejecuta tu programa)
Puedes modificar tu clase Pokemon agregando el método faltante:
class Pokemon():
def __init__(self):
self.nombre = ''
self.tipo = ''
self.latitud = ''
self.longitud = ''
self.comida = ''
self.sangre = ''
self.ano = ''
self.mes = ''
self.dia = ''
self.edad = ''
self.signo = ''
self.foto = ''
def __str__(self):
try:
return f"<Pokemon> {self.nombre} ({self.tipo})"
except SyntaxError:
return "<Pokemon> {} ({})".format(self.nombre, self.tipo)
Varias aclaraciones:
- Segun las reglas de estilo de Python, los nombres de clases deben estar en CamelCase (todas las palabras juntas con la primera letra de cada palabra en mayúscula, por ejemplo:
Pokemon
,ClinicaPokemon
TipoPokemon
, etc) - Tal como menciona @FJSevilla deberias cambiar tus atributos de clase por atributos de instancia. Comparto su enlace: Diferencia entre atributos de clase y atributos de instancia
- No se si estas usando python 3.6 por lo que coloque dos opciones en el metodo
__str__
. La primera hace uso de los fstring (en inglés), y en caso de que estes usando una version de python < 3.6.0 hará uso del métodoformat()
por medio delexcept SyntaxError
. Dependiendo de que version tengas deberias elegir una o la otra.
Jose Truyol
- 1
- 3