2016-03-18 16 views
-1

(急いでいるとハッシュタグにスキップ) このプログラムは、表示されている画像上で終了する場合にのみ機能します。 私はそれを別のループプログラム内の関数として使いたいが、うまくいきません。それはポケモン(p.whatever)の統計を表示しますが、イメージは表示されません。画像はIDLE Python 3.4では表示されますが、端末では表示されません。私は数ヶ月間これに固執してきました。イメージはループに表示されません。なぜそうではありませんか?

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

以下はそのモジュールでの作業プログラムである:ここで

は、(IDLEはPython 3.4ではなく、ターミナルで)働くプログラムです。ここで

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

+1

これは問題のhttp://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htmでしょう。 SOには100,000箇所のうちの1つがあります:http://stackoverflow.com/a/15216402/2329988そうではないかもしれませんが、それは確かです:) –

+0

@en_Knight:コードには、リンクに指定されている必須の 'image = tk.PhoteImage(...)'があります。問題は、コードに 'root.mainloop()'がないか、コマンドラインで '-i'が欠けていることです。 –

+0

@TerryJanReedyあなたは問題が何であるかをわかってうれしいです。私は彼が画像へのリンクを保存していないことを意味し、tkは弱い参照しか使用しないので、画像はフレームスタックフレームが落とされたときにgc'dすることができます。しかし、私はOPがあなたの答えを受け入れたのでここには起こっていないと思います。 –

答えて

0

は、問題を示しmcveです。ファイルtem.pyを呼び出します。

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

あなたはターミナルで実行すると、これは動作しますが、あなたはそれを見ることができる前に、ルートウィンドウは、label.pack()後に閉じます。 root.mainloop()をコードの末尾に置くか、またはpython -i tem.py(IDLEのように)で実行します。 -iは、終了せずにプログラムの終了後にバッチモードからインタラクティブモードに切り替えると言います。 IDLEはこれを実行するので、ライブプログラムが閉じられる前にライブプログラムとやりとりすることができます。

+0

私は今それを試しています。 – Anthony

+0

これは端末と私のループプログラムで動作します! – Anthony

関連する問題