Tkinter不显示图像

2024-04-26 17:44:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个代码:

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 for Python3.3编写的。它要求用户输入一个怪物的名字,然后在数据库中搜索怪物并返回怪物的属性这是在name函数中完成的。我想让它显示一张怪物的照片,这是我遇到麻烦的地方。因此,picture函数接受其中一个属性,特别是cardID属性,并将其用作gif文件的名称。但是它不能显示图片,我不知道为什么。有人知道为什么吗?在


Tags: textnameimportimgrootcansidepack
1条回答
网友
1楼 · 发布于 2024-04-26 17:44:23

为了让代码的精简版本显示.gif测试图像,我必须在picture()函数中添加一个global img语句,这样当函数返回时,变量名引用的PhotoImage对象不会被破坏。在

奇怪的是,Canvas.create_image()没有增加它传递的image对象的引用计数……看起来像是documented bug。在

更新:由于我不完全理解的原因,在picture()函数中的can = Canvas(root)后面添加一个can.img = img,这比创建一个名为img的全局更好。在

从工作版本显示:

a tk window showing test image being displayed

相关问题 更多 >