使用wxpython显示非闪烁交互式图像序列

时间:2013-05-13 09:45:06

标签: python image wxpython interactive

我创建了一个交互式图像序列查看器。只有在没有闪烁的情况下,观众才能完美地工作。我读了一下double buffering并发现它有点令人困惑。我需要直接解释/代码我应该怎么做才能消除程序中的闪烁。在大多数示例中,有一个关于调整大小的解释。我在另一方面不需要那个,我的窗户是大小固定的。那么我应该采取什么方法来解决闪烁问题?

代码:

import wx

class main_frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 'Main window', size=(1300, 750))
        self.panel = wx.Panel(self, -1)
        self.Centre()
#------------------------------------------------------------------------------
        self.Frames = []
        l=1
        while l < 365:
            self.Frames.append(wx.Image('images/{0}.png'.format(l), wx.BITMAP_TYPE_ANY))
            print l
            l+=1
        self.slider = wx.Slider(self.panel, wx.ID_ANY, size = (500,-1))
        self.slider.SetMax(356)
        l = self.slider.GetValue()

        self.image = wx.StaticBitmap(self.panel,-1,wx.BitmapFromImage(self.Frames[l]))

#------------------------------------------------------------------------------ 
        self.sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer_v = wx.BoxSizer(wx.VERTICAL)
        self.sizer_v.Add(self.image, 0, wx.CENTRE | wx.ALL, 5)
        self.sizer_v.Add(self.slider, 0, wx.CENTRE | wx.ALL, 5)
        self.sizer.Add(self.sizer_v, 1, wx.EXPAND | wx.ALL | wx.CENTER, 5)
        self.panel.SetSizer(self.sizer)

        self.Bind(wx.EVT_SLIDER, self.OnSlider, self.slider)

    def OnSlider(self,e):
        l = self.slider.GetValue()
        self.image.SetBitmap(wx.BitmapFromImage(self.Frames[l]))

if __name__ == '__main__':
    app = wx.App()
    frame = main_frame().Show()
    app.MainLoop()

1 个答案:

答案 0 :(得分:2)

wx.StaticBitmap在静态时效果最佳,与不变时一样。我认为不使用wx.StaticBitmap而是使用一个面板来绑定EVT_PAINT事件的处理程序。当您想要更改图片时,您只需执行self.panel.currentBitmap = self.Frames[i]后跟self.panel.Refresh()的操作即可。 (或者更好的方法是将该功能移到面板类中以获得更好的封装。)然后在EVT_PAINT处理程序中,您只需获取wx.PaintDC并执行当前位图的DrawBitmap。此外,我会在列表中保留位图而不是图像,以便在移动滑块时节省转换时间。