2013-06-01 169 views
0

我有這樣的代碼:Tkinter的不顯示圖像

from tkinter import * 
import urllib 
import urllib.request 
from bs4 import BeautifulSoup 
import Pydeck 
import sys 
from collections import defaultdict 

root = Tk() 
name="" 
def buttonclicked(): 
    name() 
    picture() 

def name(): 

    all_lists=[] #all lists 
    text = inputfield.get() 
    Pydeck.loadDatabase('DATABASE PATH') 
    cardName = Pydeck.getCardsFromName(text) 
    if not cardName == "": 
      c = Pydeck.Card(cardName) 
    tex.insert(END, c.name) 
    level="\nLevel %s" % c.level + " " + c.attribute + " " + c.typestring 
    tex.insert(END, level) 
    atk="\nAtk: %s" % c.attack 
    tex.insert(END, atk) 
    defe="\nDef: %s" % c.defense 
    tex.insert(END, defe) 
    typestring='\n%s' %c.typestring 
    desc='\n%s' %c.description 
    seperator='\n--------------------\n' 
    tex.insert(END, typestring) 
    tex.insert(END, desc) 
    tex.insert(END,seperator) 
    #-- 
    tex.see(END)    # Scroll if necessary 
    return c.cardID 


def picture():  
    text = inputfield.get() 
    gifdir = "PICTURE FOLDERS PATH" 
    Pydeck.loadDatabase('DATABASE PATH') 
    cardName = Pydeck.getCardsFromName(text) 
    if not cardName == "": 
     c=Pydeck.Card(cardName) 
    filename='{}.gif' .format(c.cardID) 
    img = PhotoImage(file=gifdir+filename) 
    can = Canvas(root) 
    can.pack(fill=BOTH,side='top') 
    can.config(width=img.width(), height=img.height())   
    can.create_image(2, 2, image=img, anchor=NW) 

tex=Text(root) 
tex.pack(side='right') 
inputfield = Entry(root) 
inputfield.pack(side='bottom') 
but = Button(root,text="Enter Name", command = buttonclicked) #Calls name function 
but.pack(side='bottom') 
text = inputfield.get() 

root.mainloop() 

確定,所以在短的程序處於Tkinter的用於Python 3.3。它要求用戶輸入怪物名稱,然後在數據庫中搜索怪物並返回怪物的屬性,這在name函數中完成。我想讓它展示一張我遇到麻煩的怪物的照片。所以picture函數接受其中一個屬性,特別是cardID屬性,並將其用作gif文件的名稱。但它不顯示圖片,我不知道爲什麼。有誰知道爲什麼?

+0

什麼_does_它做...什麼都沒有或者是個例外長大的嗎? – martineau

+0

它搜索數據庫中的怪物,顯示怪物信息,然後顯示怪物圖像。 – user1985351

+0

不,不是你想要它做什麼,它實際上在做什麼,導致你問你的問題。順便說一下,'name()'函數中的'tex'是什麼? – martineau

回答

3

爲了讓你的代碼來顯示一個.gif測試圖像的精簡版,我只好一個global img語句添加到picture()功能使PhotoImage對象變量名是指不會被破壞時,函數返回。

看起來很奇怪,Canvas.create_image()不增加它通過的image對象的引用計數...看起來像是documented bug

更新:至於原因,我不完全理解,將在picture()功能can = Canvas(root)完成以更好的方式同樣的事情不是創建一個全球性的在我看來,一個名爲img一個後can.img = img權利。從工作版本

顯示:

a tk window showing test image being displayed

+0

你究竟把「global」放在哪裏? – user1985351

+0

在'picture()'函數的開頭。請注意,使'img'成爲全球並不是一個好的解決方案。最好將它作爲一個更長壽命的屬性,而不是局部變量。 – martineau

+1

在這個[最小的tk應用程序](http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/minimal-app.html)中說明了避免這個陷阱的常用方法,其中創建的所有小部件都是創建派生的Application類實例的屬性。另請參閱[此答案](http://stackoverflow.com/a/16846545/355230)另一個問題。 – martineau