python - 当我试图在Toplevel小部件中显示图像时出现一个奇怪的问题

时间:2011-08-18 00:36:14

标签: python tkinter

我正在使用Python(2.5)制作“网络相册查看器”。

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

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

按钮绑定到“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()

Toplevel小部件显示,但内部没有任何内容。我发现“inner_temp.jpg”已正确下载到文件夹中,但它没有显示。

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

  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”

怎么会发生这种情况!?我真的无法理解!

有人可以帮助我吗?

谢谢,对不起我的英语很差。

3 个答案:

答案 0 :(得分:0)

如果没有看到更多代码,我的猜测是你忽略了启动事件循环,这对于小部件自我刷新是必要的。当您添加抛出错误的代码时,该错误会触发导致窗口刷新的事件循环。

答案 1 :(得分:0)

我的猜测是垃圾收集。 尝试这样的事情:

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()

答案 2 :(得分:0)

非常感谢你们!您的回答和评论可以帮助我解决问题。 我终于找到了问题! 问题出在这里: 这段代码

    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”替换局部变量可以解决这个问题!