在 Tkinter 中使用 Spritesheets

Posted

技术标签:

【中文标题】在 Tkinter 中使用 Spritesheets【英文标题】:Using Spritesheets in Tkinter 【发布时间】:2013-05-10 21:19:05 【问题描述】:

我正在 Python 的 Tkinter 中编写 GUI,但我找不到如何使用画布的 create_image 方法仅从 spritesheet 中绘制单个 sprite。提前感谢任何可以告诉我为此我需要做什么的人!

【问题讨论】:

有一个处理spritesheets的例子@pygame:pygame.org/wiki/Spritesheet。与 Canvas.create_image 一起使用应该不会太费力。 【参考方案1】:

首先,我强烈推荐你使用 Pygame,因为它有一个 concrete module 用于此目的,并且 PhotoImage 类需要保留对每个图像的引用以避免被垃圾收集(这有时有点棘手)。

话虽如此,这是一个如何使用 Tkinter 绘制单个精灵的示例(我在此示例中使用的精灵表是 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()

【讨论】:

这种方法最终可能会出现性能问题,因为它会不断删除和创建新的画布图像对象。请参阅此answer 以获得解释。 ***.com/questions/59584567/… 我使用你的代码示例,但我遇到了一些麻烦。如果您有任何建议...【参考方案2】:

你有几个选择:

Tkinter 仅支持 3 种文件格式:GIF、PGM 和 PPM。 您需要将文件转换为 .GIF 然后加载它们您可以使用 Python 图像库 (PIL) 及其 tkinter 扩展来使用 PNG 图像。

您可以在此处下载 PIL 包: http://www.pythonware.com/products/pil/

另外,如上所述,PyGame 更好地内置了对图像的支持,并且可能更易于使用。

祝你好运!

【讨论】:

以上是关于在 Tkinter 中使用 Spritesheets的主要内容,如果未能解决你的问题,请参考以下文章

在 XNA 中读取 spritesheet XML 文件

在 Unity 中来自 spritesheet 的动画异相

Windows Phone 应用程序中的 SpriteSheet 动画

SpriteSheet 类 AS3

使用 TexturePacker 构建的 SpriteSheet 未在 CCSpriteFrameCache 中加载

使用 Unity EditorWindow 从 Spritesheet 创建动画?