为什么WxPythons运动检测如此之慢?

时间:2012-06-01 11:20:37

标签: python wxpython

我将on_motion设置为处理EVT_MOTION。我希望交互式的鼠标位置生成特定于坐标的图像,但WxPython在注册连续的运动事件时有〜400ms 延迟。这使界面变得迟钝。

为什么EVT_MOTION这么慢,我该如何解决?我在Ubuntu 11.10和WinXP中试过它,延迟是可比的吗?

我需要快速响应时间来从图像中选择一部分,如图所示。就目前而言,“十字线”跟随鼠标的速度太慢了。

enter image description here

以下是我尝试EVT_MOTION的代码:

def on_motion(self, event):
    """mouse in motion"""
    #pt = event.GetPosition()
    self.mouseover_location = event.GetPosition()
    self.t2 = time.time()
    print "delay",self.t2 - self.t1
    self.t1 = self.t2

delay 0.379776954651
delay 0.00115919113159
delay 0.421130895615
delay 0.416938066483
delay 0.376848936081
delay 0.387464046478
delay 0.40311384201
delay 0.392899036407
delay 0.385301113129
delay 0.422554969788
delay 0.355197906494

3 个答案:

答案 0 :(得分:3)

现在的问题是不完整的,因为没有示例应用来证明问题。但是,我会说动作处理程序与您的问题无关,因为很可能您在后续动作处理程序之间进行了一些昂贵的操作(比如刷新整个绘图画布)。

如果是这种情况(并且您可以轻松检查是否在鼠标运动事件之间调用了涂料例程),我建议如下:

  1. 如果您自己绘制的图纸,请确保使用双缓冲(通过wx.BufferedPaintDC);
  2. 如果您的绘图例程确实是在鼠标移动之间调用的,请尝试仅刷新绘图的损坏部分(通过RefreshRect);
  3. 使用wx.Overlay绘制矩形选区(有一些演示可用于如何做到这一点);
  4. 发布一个可展示问题的小型可运行示例应用程序。

答案 1 :(得分:2)

每次移动鼠标时都会触发EVT_MOTION!如果您随后在每次移动时调用event.GetPosition()并处理数据,这将降低性能。 如何使用EVT_LEFT_DOWN或类似的东西,然后获取位置并处理该数据。 由于您只是在寻找图像的某个区域,因此效率会更高。

答案 2 :(得分:2)

我们真的需要看看应用程序中还有什么能够为您提供任何有意义的答案,尽管很多人能够在创建示例问题的小样本过程中自行解决问题与他人分享。

http://wiki.wxpython.org/MakingSampleApps

优化你如何绘制十字准线和/或如何刷新窗口的主要内容可能是你最好的选择,但在你分享更多细节之前我们所能做的就是猜测。