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()
我想在我的应用程序中播放动画 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()