无法在wxPython中播放动画

0 投票
2 回答
1384 浏览
提问于 2025-04-18 12:05

我想在我的框架里播放一个GIF动图,这个动图是我从preloaders网站上下载的:

class TestFrame(wx.Frame):

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, -1, title, style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)

        self.animation = wx.animate.AnimationCtrl(self, pos=(40,40), size=(24, 24), name="AnimationCtrl")
        self.animation.LoadFile("./gui/icons/preloader.gif", wx.animate.ANIMATION_TYPE_GIF)
        self.animation.Play()

        size = (310, 150)
        self.SetSize(size)
        self.icon = wx.Icon('./gui/icons/app.ico', wx.BITMAP_TYPE_ICO)
        self.SetIcon(self.icon)
        self.Show()

结果我看到的只是所有的GIF(看起来就像是把图片直接放在框架里)。我哪里做错了呢?

2 个回答

2

其实我是在用Python 3和wxPython Phoenix,但这段代码对我来说是有效的。

import wx
from wx.adv import Animation, AnimationCtrl

class TestFrame(wx.Frame):

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, -1, title)

        self.animation = AnimationCtrl(self, pos=(40,40), size=(24, 24), name="AnimationCtrl")
        self.animation.LoadFile("animated.gif")
        self.animation.Play()

        size = (400, 400)
        self.SetSize(size)
        self.Show()

app = wx.App()
frame = TestFrame(None, -1, "Test gif")
app.MainLoop()

对于wxPython,我觉得你需要用GIFAnimationCtrl,而不是AnimationCtrl。不过我没有环境来测试这个。这里有相关的文档。 可惜的是,内容比较少。

更棒的是 有一篇博客文章提供了一个例子。这应该能给你一些参考。http://www.daniweb.com/software-development/python/code/216673/wxpython-animated-gif

1

我在我的电脑上测试了你的代码,运行得很好。我使用的是Python 2.7和wxPython 3.0。如果你还没有解决你的问题,可以试试这个代码:

import wx.animate

class TestFrame2( wx.Frame ):
    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Testing!", pos = wx.DefaultPosition, size = ( 300,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.RESIZE_BORDER )
        self.m_animCtrl1 = wx.animate.AnimationCtrl( self, wx.ID_ANY, wx.animate.NullAnimation, ( 40,40 ), ( -1,-1 ), wx.animate.AC_DEFAULT_STYLE )
        self.m_animCtrl1.LoadFile( u"img.GIF" )
        self.m_animCtrl1.Play()
        self.Layout()
        self.Show()
        self.Centre( wx.BOTH )

if __name__ == "__main__":
    App = wx.App()
    TestFrame2(None)
    App.MainLoop()

撰写回答