wxPython:动画gif作为背景

wxPython: animated gif as background

我想在我的应用程序中播放动画 gif 作为背景,上面有按钮、静态文本和面板。我想我几乎已经找到了解决方案,但我不知道是否有更简单的方法。

在下面的代码示例中,我嵌套了面板,我想将动画设置为下层,但我不确定问题是否是我需要更新面板以使其在 gif 上可见动画。

欢迎任何提示:)

import wx
from wx.adv import Animation, AnimationCtrl


class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = \
            kwds.get("style", 0) | wx.CAPTION | wx.CLOSE_BOX | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX | wx.RESIZE_BORDER
        wx.Frame.__init__(self, *args, **kwds)

        self.SetTitle("ParKING")
        _icon = wx.NullIcon
        _icon.CopyFromBitmap(wx.Bitmap('ico.png', wx.BITMAP_TYPE_ANY))
        self.SetIcon(_icon)
        self.Center()

        sz1 = wx.BoxSizer()
        sz2 = wx.BoxSizer()
        sz3 = wx.BoxSizer()

        p1 = wx.Panel(self)
        p2 = wx.Panel(p1)
        p3 = wx.Panel(p2)

        p1.SetBackgroundColour(wx.RED)
        p2.SetBackgroundColour(wx.GREEN)
        p3.SetBackgroundColour(wx.BLUE)

        sz3.Add(p3, 1, wx.ALL | wx.EXPAND, 20)
        p2.SetSizer(sz3)
        sz2.Add(p2, 1, wx.ALL | wx.EXPAND, 20)
        p1.SetSizer(sz2)
        sz1.Add(p1, 1, wx.ALL | wx.EXPAND, 0)

        anim = Animation('fondo.gif',type=wx.adv.ANIMATION_TYPE_GIF)
        ctrl = AnimationCtrl(p1, -1, anim)
        ctrl.Play()

        self.SetSizer(sz1)
        self.Show()


class MyWindow(wx.Window):

    def __init__(self):
        wx.Window.__init__(self)
        frame = MyFrame(None, wx.ID_ANY, "")
        self.Create(frame)


class MyApp(wx.App):
    def OnInit(self):
        MyWindow()
        return True


if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()

在 wx 中,有两种方法可以相对于 parent 控件排列 child 控件: Absolute(通过 child 的 pos属性或参数)或通过sizers(children的位置根据sizer的类型自动分配)。您的代码的问题是您在面板 p1 中混合了两种方法:它有面板 p2 和动画控制 ctrl as children, p2 通过sizer排列 sz2, ctrl 通过绝对位置排列(因为您没有给 pos 参数赋值,所以它采用默认值,位置 (0,0) 以像素为单位)。

对于您提出的问题,最好不要使用 sizer(除了将 p1 放在主 window 中)并使 ctrl a child of p1, and p2 and p3 children ctrl,绝对排列:

...
self.Center()

szw = wx.BoxSizer()

p1 = wx.Panel(self)
anim = Animation('fondo.gif', type=wx.adv.ANIMATION_TYPE_GIF)
ctrl = AnimationCtrl(p1, wx.ID_ANY, anim, pos=(0, 0))
p2 = wx.Panel(ctrl, pos=(10, 20), size=(50, 30))
p3 = wx.Panel(ctrl, pos=(160, 150), size=(30, 50))

p1.SetBackgroundColour(wx.RED)
p2.SetBackgroundColour(wx.GREEN)
p3.SetBackgroundColour(wx.BLUE)

szw.Add(p1, 1, wx.ALL | wx.EXPAND, 0)
self.SetSizer(szw)

ctrl.Play()

self.Show()