使用wxpython实时绘制数据流中的轨迹

时间:2017-07-06 13:11:08

标签: python-2.7 bitmap wxpython real-time

我想使用wxpython实时显示随机游走的轨迹。但是,面板最后只更新一次,显示整个随机游走,而不是逐步更新并显示时间进程。

我的第一个想法是使用wx.ClientDC()。DrawPoint(),但结果如上所述,我没有看到正在绘制单个点,但只显示了最终结果。

所以我考虑使用wx.MemoryDC将轨迹绘制到存储在内存中的位图,然后使用wx.ClientDC.DrawBitmap()以设定的时间间隔将缓冲的图像复制到屏幕,以防翻转图像瓶颈。结果仍然是一样的,所以我希望你帮忙。

本练习的目的是用来自眼动仪的位置数据取代随机游走,帧速率为1000赫兹,我希望能够尽可能接近实时地显示轨迹(显示器的帧速率为120Hz)。

这是我的代码(大部分来自here):

3779 * 0.054 = 95.9866
3780 * 0.054 = 96.012

1 个答案:

答案 0 :(得分:0)

这是我提出的解决方案。我没有使用dc.DrawBitmap()将缓冲的图像复制到屏幕,而是使用Update()和Refresh()来触发绘制事件。但是,我仍然不明白为什么我不能使用DrawBitmap()来实现同样的目标。

唯一的区别是OnPaint()使用PaintDC(),而在OnClick()中我使用ClientDC()。

无论如何,这是我当前的OnClick()代码:

def OnClick(self,event):
    pos = event.GetPosition()
    x = pos.x
    y = pos.y
    time_start = time.time()

    memdc = wx.MemoryDC()
    memdc.SelectObject(self.BufferBmp)
    dcwi, dche = memdc.GetSizeTuple()
    memdc.SetPen(wx.Pen(wx.BLACK,1,wx.SOLID))
    runtime = 10
    while (time.time() - time_start) < runtime:
        x,y = random_walk(x,y,dcwi,dche)
        memdc.SelectObject(self.BufferBmp)
        memdc.DrawPoint(x,y)
        memdc.SelectObject(wx.NullBitmap)
        self.Update()
        self.Refresh()
    print jmtime() + 'Random walk in MyDrawingArea done'