wx.Timer用于动画

2 投票
1 回答
634 浏览
提问于 2025-04-17 12:10

简单的动画,这个方法可以用,但替换后的图片数据会保留在缓存里吗?使用定时器来做动画会对CPU有害吗?我的意思是像 self.timer.Start(25) 这样的方法,可以从单独的图片文件中做出很酷的动画。

self.nm = ['01.png', '02.png', '03.png', '04.png']
self.stop = 0

def time(self, event):
    self.count += 1
    if self.count == 1:
        self.anime = wx.StaticBitmap(self, -1, wx.Bitmap(self.nm[self.stop], wx.BITMAP_TYPE_ANY))
    if self.count == 2:
        self.anime.Show(0)
        if self.stop == 3:
            self.timer.Stop()
        else:
            self.stop+=1
            self.count = 0
    event.Skip()

1 个回答

1

首先,你每次需要显示图片时,确实是在重新加载每一张图片。这是非常糟糕的,因为这样会频繁地访问硬盘,而硬盘通常是你程序中最慢的设备。尽量避免在可以的情况下使用硬盘。

为了改善这个问题,有几个选择:

  • 创建你自己的 wx.animate.Animation 子类来匹配你的动画(需要重写一些 wx.animate.Animation 的方法,还要重写一些 wx.animate.AnimationBase 的方法。这是解决这个问题的正确方法,但不是最简单的。
  • 如果你的动画可以转换成 .gif 格式且不会有明显的细节损失,可以使用 wx.animate.AnimationCtrl。这个方法比前一个简单一些,因为你不需要编写任何动画代码。
  • 将位图保存在内存中;简单地把它们存储在某个列表里(“某个地方”并不是指在 time 函数内部,因为那样每次调用 time 函数时仍然会重新加载;“某个地方”是指作为 time 函数所属对象的一个成员)。
  • 将所有位图保存在用户界面中,当需要切换帧时,只需切换它们的可见性。

撰写回答