在 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的主要内容,如果未能解决你的问题,请参考以下文章
Windows Phone 应用程序中的 SpriteSheet 动画