使用DC时,消除不必要的图像绘制?

时间:2011-05-06 04:27:52

标签: python drawing wxpython

我有三个问题,我可以真正使用一些帮助。希望我不要求太多。

1)我正在设计一个包含一个框架和一个面板的简单GUI。假设我使用直流在面板上绘制了两张图像。一个图像将不断淡入和淡出(在计时器上),第二个图像将静止(不变)。通过更改图像的不透明度来完成淡入淡出,并在重新绘制新版本的图像之前使用dc.Clear()。

我的问题是:如何在不影响不改变的第二张图像的情况下绘制淡入/淡出图像?这似乎会导致不必要的绘图,因为静止图像将与淡化图像一起重绘。我可以选择性地清除第一张图像而不影响第二张图像吗?这是我的绘图功能:

def on_paint(self, event):
    dc = wx.PaintDC(self)
    dc = wx.BufferedDC(dc)

    brush = wx.Brush('#3B3B3B')
    dc.SetBackground(brush)
    dc.Clear()

    # Draw the first image (stationary)
    dc.DrawBitmap(stationaryBitmap, 120, 0, True)

    # Draw the second image (fading)
    image = self.image.AdjustChannels(1, 1, 1, self.factoralpha)
    fadingBitmap = wx.BitmapFromImage(image)
    dc.DrawBitmap(fadingBitmap, 120, 0, True)

2)如何将事件绑定到wx.Image对象?我希望能够点击淡入/淡出图像,但我似乎无法为其分配ID。目标是绑定一个类似于我可以用wx.StaticBitmap做的事件。

self.image = wx.Image("C:\image.png", wx.BITMAP_TYPE_PNG)

# Trying to bind an event, but no ID is assigned
self.Bind(wx.EVT_BUTTON, self.go_button, id=self.image.GetId())

3)是否可以将wx.DrawBitmap放入sizer中?它似乎只需要一个x,y坐标对。

dc.DrawBitmap(bitmap, 120, 0, True)

谢谢大家。

1 个答案:

答案 0 :(得分:0)

1)对于Performance,我建议使用MemoryDC并仅在需要时更新Drawing。见这里:BufferedCanvas。您可能希望使用2个以上的缓冲区,因为您使用的是2个图像(参见示例)。

2)我不知道有关此问题,但您是否尝试过对面板进行绑定并将面板淡入/淡出? 您可以直接在wx.Panel上绘画。

此致