0

听起来像 Photoshop 中的“图层中的图像”可能不合适,但实际上这就是我所拥有的并且想要实现的。

在启动我的程序后,我使用一组 wx.boxsizer 来获得一个漂亮且有条理的屏幕。

在水平 wx.BoxSizer 的一行中,我有 3 列使用不同的 wx.Panels 完成,每一列都包含由 Timer 函数完成的移动 wx.StaticBitmaps。

中间的第二个 wx.Panel 与保持原始面板大小的比例为 0,实际上包含 2 个图像,一个具有透明度的 PNG 和移动的 wx.StaticBitmap,它应该是这个 PNG 的背景。

这不适合我。我只是希望PNG位于由计时器移动的另一个图像之上。2层,如果你喜欢。

它正在创建一个非常简单和基本的动作效果(就像 PNG 中的对象正在运行)

现在我想到了一些方法来解决这个问题,但没有一个奏效:

  1. 弄清楚 python 如何决定将哪个图像放在前面,哪些留在后面。操纵那个
  2. 将运动图像保留在大小调整器中,取出 PNG 并将其放在运动图像上(比我需要动态确定运动图像在哪里)
  3. 将运动图像设为 wx.panel 背景,然后我可以简单地调用透明 PNG。

我将在此处粘贴我的脚本的一部分以供勇敢的眼睛使用:

class AnimationPanel(wx.Panel):
  def __init__(self, parent):
    wx.Panel.__init__(self, parent)
    self.loc = wx.Image("intro/runner.png",wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    self.locpic = wx.StaticBitmap(self, -1, self.loc, (0, 0), (self.loc.GetWidth(), self.loc.GetHeight()))
    self.xer = 3080
    self.xer2 = 2310
    self.xer3 = 1540
    self.env = wx.Image("intro/environ1.png",wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    self.env2 = wx.Image("intro/environ2.png",wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    self.env3 = wx.Image("intro/environ3.png",wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    self.picture = wx.StaticBitmap(self, -1, self.env, (0, 0), (self.env.GetWidth(), self.env.GetHeight()))
    self.picture2 = wx.StaticBitmap(self, -1, self.env2, (770, 0), (self.env2.GetWidth(), self.env2.GetHeight()))
    self.picture3 = wx.StaticBitmap(self, -1, self.env3, (1540, 0), (self.env3.GetWidth(), self.env3.GetHeight()))
    self.timer = wx.Timer(self)            
    self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
    self.timer.Start(5)

  def OnTimer(self, event):
    if self.xer <= 3080:
        self.xer += 1
        self.picture.Move((self.xer,0))
    else:
        self.xer = -770
    if self.xer2 <= 3080:
        self.xer2 += 1
        self.picture2.Move((self.xer2,0))
    else:
        self.xer2 = -770
    if self.xer3 <= 3080:
        self.xer3 += 1
        self.picture3.Move((self.xer3,0))
    else:
        self.xer3 = -770

这是在主框架中:

    ap = AnimationPanel(self)
    v2box = wx.BoxSizer(wx.HORIZONTAL)
    v2box.Add(someother, 1, wx.EXPAND)
    v2box.Add(ap, 0, wx.EXPAND)
    v2box.Add(someother, 1, wx.EXPAND)

我确实对此进行了研究,但我是一个初学者,所以如果可能的话,请帮助我提供一些简单的提示或建议。

谢谢。

4

1 回答 1

1

在 wxpython 演示安装中有一个包含 pySketch 演示的示例文件夹。

In this code it creates dc drawn objects that can be moved in front and behind other objects.

A quick look over this code it looks like the drawn items are stored in a list and then drawn in the list order.

I guess that's how you would implement your layering, you would have a list of layers and in each layer you would store your items for that layer.

于 2013-03-29T17:08:41.743 回答