Я пишу графический интерфейс в Tkinter Python, и я не могу найти, как использовать метод create_image на холсте, чтобы рисовать только один спрайт из спрайта. Заранее благодарю всех, кто может сказать мне, что мне нужно сделать для этого!Использование спрайтов в Tkinter
ответ
Прежде всего, я настоятельно рекомендую вам использовать Pygame, поскольку для этой цели у него есть concrete module, а класс PhotoImage должен содержать ссылку на каждое изображение, чтобы избежать сбора мусора (что иногда немного сложно) ,
Сказав это, это пример того, как рисовать отдельные спрайты с помощью Tkinter (spritesheet, который я использовал для этого примера, - this one, преобразованный в файл GIF).
import Tkinter as tk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.spritesheet = tk.PhotoImage(file="spritesheet.gif")
self.num_sprintes = 4
self.last_img = None
self.images = [self.subimage(32*i, 0, 32*(i+1), 48) for i in range(self.num_sprintes)]
self.canvas = tk.Canvas(self, width=100, height=100)
self.canvas.pack()
self.updateimage(0)
def subimage(self, l, t, r, b):
print(l,t,r,b)
dst = tk.PhotoImage()
dst.tk.call(dst, 'copy', self.spritesheet, '-from', l, t, r, b, '-to', 0, 0)
return dst
def updateimage(self, sprite):
self.canvas.delete(self.last_img)
self.last_img = self.canvas.create_image(16, 24, image=self.images[sprite])
self.after(100, self.updateimage, (sprite+1) % self.num_sprintes)
app = App()
app.mainloop()
У вас есть несколько вариантов здесь:
Tkinter поддерживает только 3 форматов: GIF, PGM и PPM. Вам необходимо либо преобразовать файлы в .GIF, либо загрузить их или вы можете использовать Python Imaging Library (PIL) и его расширения tkinter для использования PNG-изображения.
Вы можете скачать пакет PIL здесь: http://www.pythonware.com/products/pil/
В качестве альтернативы, как уже упоминалось выше, PyGame еще лучше встроенную поддержку изображений и может быть проще в использовании.
Удачи вам!
Существует пример обработки спрайтов @ pygame: http://www.pygame.org/wiki/Spritesheet. Это не должно быть большим усилием, чтобы использовать его вместе с Canvas.create_image. –