Холст Tkinter PhotoImage не появляется

У меня проблема с моим кодом. Я создаю небольшую видеоигру под названием Lumanite. Я создал домашнюю страницу и начал генерацию графики, но столкнулся с ошибкой. Я использую Python 3.3 и работаю на ноутбуке с Win 10. Я запускаю программу через файл запуска, который обращается к файлу main_game, в котором используются классы, описанные в отдельном файле spritesclasses. Я пытаюсь заставить спрайт появиться. Вот код файла main_game и файла spritesclasses. (Они импортируют холст и корень из файла МЕНЮ)

#SPRITES
from tkinter import *
from GUI_FILE import canvas, root
from OPENING_FILE import show, hide

class Sprite():
     def __init__(self, photoplace):
          self.orgin = photoplace
          self.photo = PhotoImage(file=photoplace)
          self.w = self.photo.width()
          self.h = self.photo.height()
     def draw(self):
          self.sprite = canvas.create_image(self.h, self.w, image=self.photo)

И файл MAIN_GAME:

#Main Game File:
from tkinter import *
from OPENING_FILE import show, hide
from GUI_FILE import root, canvas
from spritesclasses import *


def start_game():
      genterrain()

def genterrain():
       test = Sprite("logo.gif")
       test.draw()

И спрайты не появляются. Ни ошибки, ничего. Помогите мне, пожалуйста. Я предоставлю вам информацию при дальнейшем уведомлении.


person Lumater    schedule 01.10.2017    source источник


Ответы (1)


Это известная, но сложная проблема. Вы можете прочитать об этом в Почему мои изображения Tkinter не появиться? Я реализовал одно возможное решение ниже:

from tkinter import *

class Sprite():
    def __init__(self, photoplace):
        self.photo = PhotoImage(file=photoplace)
        self.w = self.photo.width()
        self.h = self.photo.height()
        self.sprite = None

    def draw(self):
        canvas = Canvas(root, width=self.w, height=self.h)
        canvas.pack()
        self.sprite = canvas.create_image(0, 0, anchor=NW, image=self.photo)

def start_game():
    genterrain()

def genterrain():
    sprite = Sprite("logo.gif")
    sprite.draw()
    sprites.append(sprite)  # keep a reference!

root = Tk()

sprites = []

start_game()

root.mainloop()

Присвоение self.photo = PhotoImage(file=photoplace) не является достаточной ссылкой, так как объект test выходит за пределы области видимости, когда genterrain() возвращается и удаляется вместе с вашим изображением. Вы можете проверить это, закомментировав строку sprites.append(sprite), и ваше изображение снова исчезнет.

Кроме того, было неясно, почему вы позиционируете изображение по его ширине и высоте - первыми аргументами create_image() являются позиции X и Y. Я переместил создание холста в draw(), чтобы размер холста соответствовал изображению, но это не является требованием исправления видимости.

person cdlane    schedule 01.10.2017
comment
Большое спасибо. Я действительно нуждался в этом. - person Lumater; 31.10.2017