2013-06-01 139 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