Python - странная проблема, когда я пытаюсь отобразить изображение в виджете Toplevel - PullRequest
0 голосов
/ 18 августа 2011

Я использую Python (2.5), чтобы создать «средство просмотра веб-альбомов».

Я использую Tkinter для написания графического интерфейса, urllib2 для извлечения изображения из Интернета, 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 голосов
/ 19 августа 2011

Полагаю, будет сборка мусора.Попробуйте что-то вроде этого:

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()
0 голосов
/ 19 августа 2011

Спасибо всем большое! Ваши ответы и комментарии помогут мне решить проблему. Я наконец нашел проблему! Проблема здесь: этот код

    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" решает эту проблему!

0 голосов
/ 18 августа 2011

Не видя больше кода, я предполагаю, что вы пренебрегаете началом цикла обработки событий, который необходим для обновления самих виджетов.Когда вы добавляете код, который выдает ошибку, эта ошибка запускает цикл событий, который вызывает обновление окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...