python—当我';我正在尝试在顶级小部件中显示图像

python—当我';我正在尝试在顶级小部件中显示图像,python,tkinter,Python,Tkinter,我正在使用Python(2.5)制作一个“web相册查看器” 我使用Tkinter编写GUI,使用urllib2从web获取图像,使用PIL处理图像 用户将单击一个按钮,然后它将创建一个顶级小部件,下载图片,并在顶级小部件中显示它 该按钮绑定到“look”方法 所以代码是这样的: class App: #some codes are omitted here def look(self, pic_url): top = Toplevel() more = More(t

我正在使用Python(2.5)制作一个“web相册查看器”

我使用Tkinter编写GUI,使用urllib2从web获取图像,使用PIL处理图像

用户将单击一个按钮,然后它将创建一个顶级小部件,下载图片,并在顶级小部件中显示它

该按钮绑定到“look”方法

所以代码是这样的:

class App:

  #some codes are omitted here

  def look(self, pic_url):
    top = Toplevel()
    more = More(top, pic_url)

class More:
  def __init__(self, master, pic_url):
    self.frame = Frame(master)
    self.frame.pack()
    response = urllib2.urlopen(pic_url)
    open("inner_temp.jpg", "wb+").write(response.read())
    self.picture = ImageTk.PhotoImage(file = "inner_temp.jpg")    
    self.photo_label = Label(self.frame, image = self.picture)
    self.photo_label.pack()
class More:
  def __init__(self, master, pic_url):
    self.frame = Frame(master)
    self.frame.pack()
    response = urllib2.urlopen(pic_url)
    open("inner_temp.jpg", "wb+").write(response.read())
    self.frame.picture = ImageTk.PhotoImage(file = "inner_temp.jpg")    
    self.photo_label = Label(self.frame, image = self.frame.picture)
    self.photo_label.pack()
顶级小部件显示了,但里面什么也没有。我发现“internal_temp.jpg”已正确下载到文件夹中,但它只是没有显示出来

但最奇怪的是,如果我在代码的末尾键入一个字符,控制台窗口将显示错误消息,但是顶级小部件中显示的图片

  def look(self, pic_url):
    top = Toplevel()
    more = More(top, pic_url)

class More:
  def __init__(self, master, pic_url):
    self.frame = Frame(master)
    self.frame.pack()
    response = urllib2.urlopen(pic_url)
    open("inner_temp.jpg", "wb+").write(response.read())
    self.picture = ImageTk.PhotoImage(file = "inner_temp.jpg")    
    self.photo_label = Label(self.frame, image = self.picture)
    self.photo_label.pack()
    x
NameError:未定义全局名称“x”

这怎么会发生!?我真的搞不懂

有人能帮我吗


谢谢,我很抱歉我的英语不好。

没有看到更多的代码,我猜您忽略了启动事件循环,这是小部件刷新自身所必需的。当您添加抛出错误的代码时,该错误会触发事件循环,从而导致窗口刷新。

我猜可能是垃圾收集。 试着这样做:

class App:

  #some codes are omitted here

  def look(self, pic_url):
    top = Toplevel()
    more = More(top, pic_url)

class More:
  def __init__(self, master, pic_url):
    self.frame = Frame(master)
    self.frame.pack()
    response = urllib2.urlopen(pic_url)
    open("inner_temp.jpg", "wb+").write(response.read())
    self.picture = ImageTk.PhotoImage(file = "inner_temp.jpg")    
    self.photo_label = Label(self.frame, image = self.picture)
    self.photo_label.pack()
class More:
  def __init__(self, master, pic_url):
    self.frame = Frame(master)
    self.frame.pack()
    response = urllib2.urlopen(pic_url)
    open("inner_temp.jpg", "wb+").write(response.read())
    self.frame.picture = ImageTk.PhotoImage(file = "inner_temp.jpg")    
    self.photo_label = Label(self.frame, image = self.frame.picture)
    self.photo_label.pack()

非常感谢大家!你的回答和评论帮助我解决了这个问题。 我终于发现了问题! 问题在于: 此代码

    class App:

  #some codes are omitted here

  def look(self, pic_url):
    top = Toplevel()
    more = More(top, pic_url)
应该是

    class App:

  #some codes are omitted here

  def look(self, pic_url):
    top = Toplevel()
    self.more = More(top, pic_url)

虽然我不熟悉Python的垃圾收集机制,但我认为图片仅显示错误是否发生的原因是错误阻止垃圾收集清除局部变量“more”的某些部分。用实例变量“self.more”替换局部变量解决了这个问题

我对Tkinter没有信心,但在
\uuu init\uuu
更改某些内容之后,似乎还有另一种方法,
x
错误正在阻止某些内容。@James:我想你是对的!非常感谢你!