2014-11-17 2 views
-1

У меня возникли проблемы преобразование моего PIL изображения в Tkinter изображение, вот мой класс: неPIL изображение для Tkinter не делает, если переменная PhotoImage не является глобальной

class GameText(): 
    def __init__(self, parent, xPos, yPos, text, tag="default"): 
     global drawTex 
     self.parent = parent 
     self.xPos = xPos 
     self.yPos = yPos 
     self.text = str(text) 
     self.tag = tag 

     image = Image.new("RGBA", (400, 400), None) 

     draw = ImageDraw.Draw(image) 
     draw.text((0, 0), self.text, font=font, fill="white") 
     del draw 

     drawTex = ImageTk.PhotoImage(image) 
     self.image = self.parent.create_image(self.xPos, self.yPos, image=drawTex, tag=self.tag) 

отображается на всех, если drawTex ISN Нет изображения 't global, и даже если это так, отображается только одно изображение, если бы я должен был создать эти два объекта, появлялось бы только последнее.

self.test1 = GameText(self, 300, 300, "ab") 
self.test2 = GameText(self, 300, 300, "hi") 

Почему drawTex должен быть глобальным, и почему отображается только последнее изображение?

+0

Что вы хотите сказать? –

+0

Почему drawTex должен быть глобальным, и почему отображается только последнее изображение? (Также отредактировал его в) – Eykar

+0

, потому что без него 'drawTex' является локальной переменной, которая получает сбор мусора, когда метод возвращается. –

ответ

1

Только что решил это, я понятия не имею, почему, но добавив self. в drawTex, он работает так, как планировалось.

+0

добавление 'self' в' drawTex' имеет тот же (как правило) эффект, как глобализация 'drawTex'. – W1ll1amvl

+1

... потому что добавление 'self'' к переменной' drawTex' сохранил экземпляр 'PhotoImage', созданный как атрибут объекта GameText, а не локальную переменную, поэтому он больше не удаляется, как только' Возвращает метод __init __(). – martineau

Смежные вопросы