2016-03-18 14 views
-1

(Skip zu Hash-Tags, wenn in Eile) Dieses Programm wird nur funktionieren, wenn es auf dem Bild endet. Ich möchte es als Funktion in einem anderen Loop-Programm verwenden, aber es wird nicht funktionieren. Es zeigt die Werte des Pokémon an (p.whatever), aber das Bild wird nicht angezeigt. Das Bild wird in IDLE Python 3.4, aber nicht im Terminal angezeigt. Ich war monatelang dran.Das Bild wird nicht in einer Schleife angezeigt, warum nicht?

Hier ist das Programm, das (in IDLE Python 3.4, nicht das Terminal) funktioniert:

import pykemon 
print('What are you looking for?') 
askedpokemon = input() 


pokemonInDatabase = False 
while pokemonInDatabase == False: 
    pokemonInDatabase = True 
    try: 
     if ('1' in askedpokemon) or ('2' in askedpokemon) or ('3' in askedpokemon) or ('4' in askedpokemon) or ('5' in askedpokemon) or ('6' in askedpokemon) or ('7' in askedpokemon) or ('8' in askedpokemon) or ('9' in askedpokemon): 
      p = (pykemon.get(pokemon_id = askedpokemon)) 

     else: 
      askedpokemon = askedpokemon.lower() 
      p = (pykemon.get(pokemon = askedpokemon)) 
      #Turns askedpokemon into number 
      askedpokemon = p.resource_uri 
      askedpokemon = askedpokemon.replace('/api/v1/pokemon/',' ') 
      askedpokemon = askedpokemon.replace('/',' ') 
      askedpokemon = askedpokemon.strip() 


    except pykemon.exceptions.ResourceNotFoundError: 
     print(askedpokemon + " is not a valid Pokemon name or id number.") 
     print('Try another') 
     askedpokemon = input() 
     pokemonInDatabase = False 



print (p) 

pTypes = (p.types) 
for key, value in pTypes.items() : 
    pTypes = str(key) 
    print (' Type: ' + pTypes) 
print ('  HP: ' + str(p.hp)) 
print (' Attack: ' + str(p.attack)) 
print ('Defense: ' + str(p.defense)) 
print (' Sp Atk: ' + str(p.sp_atk)) 
print (' Sp Def: ' + str(p.sp_def)) 
print (' Speed: ' + str(p.speed)) 
print ('Exp Yield: ' + str(p.exp)) 

####################################################### 
import time 
import urllib 
import urllib.request 
import tkinter as tk 
root = tk.Tk() 
url = "http://assets22.pokemon.com/assets/cms2/img/pokedex/full/526.png" 

if len(askedpokemon) < 3: 
    if len(askedpokemon) == 2: 
     askedpokemon = ('0' + askedpokemon) 
    if len(askedpokemon) == 1: 
     askedpokemon = ('00' + askedpokemon) 

url = url.replace('526', askedpokemon) 
u = urllib.request.urlopen(url) 
raw_data = u.read() 
u.close() 
import base64 
b64_data = base64.encodestring(raw_data) 
image = tk.PhotoImage(data=b64_data) 
label = tk.Label(image=image) 
label.pack() 
########################################################## 

Unten ist das Arbeitsprogramm mit seinen Modulen. Hier

https://drive.google.com/file/d/0B3Q4wQpL0nDUYWFFSjV3cUhXVWc/view?usp=sharing

+1

Ich würde wetten, das ist das Problem http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm. Einer von 100.000 Orten kommt auf SO: http://stackoverflow.com/a/15216402/2329988. Kann nicht der Fall sein ... aber ich wette, es ist :) –

+0

@en_Knight: Der Code hat die erforderliche 'image = tk.PhireImage (...)' wie im Link angegeben. Das Problem ist das Fehlen von 'root.mainloop()' im Code oder '-i' in der Befehlszeile. –

+0

@TerryJanReedy froh, dass Sie herausgefunden haben, was das Problem war. Ich meinte, dass er keine Verbindung zu dem Bild speicherte, und dass tk nur schwache Referenzen verwendet, so dass das Bild gc'd werden kann, wenn der Rahmenstapelrahmen fallengelassen wird. Aber ich denke, das passiert hier nicht, da das OP Ihre Antwort akzeptiert –

Antwort

0

ist ein mcve, die das Problem veranschaulicht. Rufen Sie die Datei tem.py.

import tkinter as tk 
root = tk.Tk() 
image = tk.PhotoImage(file='python.png') 
label = tk.Label(image=image) 
label.pack() 

Wenn Sie in einem Terminal laufen, dies läuft, aber das Root-Fenster schließt nach label.pack(), bevor Sie sie sehen können. Entweder setzen Sie root.mainloop() am Ende des Codes oder führen Sie mit python -i tem.py (wie IDLE, tatsächlich, tut). Die -i sagt, nach dem Ende des Programms vom Batch- in den interaktiven Modus zu wechseln, anstatt zu schließen. IDLE tut dies, damit man mit dem Live-Programm interagieren kann, bevor es geschlossen wird.

+0

Ich versuche es jetzt. – Anthony

+0

Es funktioniert im Terminal und in meinem Looping-Programm! – Anthony

Verwandte Themen