【问题标题】:Tkinter not displaying imageTkinter 不显示图像
【发布时间】:2013-06-01 18:30:27
【问题描述】:

我有这个代码:

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 Python 3.3 中。它要求用户输入怪物的名字,然后在数据库中搜索怪物并返回怪物的属性,这是在name 函数中完成的。我希望它显示我遇到麻烦的怪物的图片。因此picture 函数采用属性之一,特别是cardID 属性并将其用作gif 文件的名称。但是它不显示图片,我不知道为什么。有谁知道为什么?

【问题讨论】:

  • 做什么...什么都不做还是引发了异常?
  • 它在数据库中搜索怪物,显示怪物信息,然后显示怪物图像。
  • 不,不是你想让它做什么,而是它实际上在做什么导致你问你的问题。顺便说一句,name() 函数中的 tex 是什么?
  • 它扩展了图片应该在的框架,但实际上并没有显示图片。而tex.insert则是在文本框中插入变量。

标签: python python-3.x tkinter image python-3.3


【解决方案1】:

为了获得代码的精简版本以显示 .gif 测试图像,我必须将global imgstatement 添加到picture()函数,以便变量名所指的PhotoImageobject函数返回时不会被销毁。

Canvas.create_image() 没有增加它传递的image对象的引用计数似乎很奇怪......看起来它是一个documented bug

更新:出于我不完全理解的原因,在can = Canvas(root) 之后添加can.img = img@picture() 函数以比创建全局更好的方式完成相同的事情在我看来,命名为img

从工作版本显示:

【讨论】:

  • 你把global放在哪里?
  • picture() 函数的开头。请注意,将img 设为全局并不是一个好的解决方案。最好将其作为一个更长寿的属性,而不是一个局部变量。
  • minimal tk application 说明了避免这种陷阱的常用方法,其中创建的所有小部件都是派生的Application 类实例的属性。另请参阅this answer 另一个问题。
猜你喜欢
  • 2017-08-26
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多