8

我设置on_motion为处理EVT_MOTION。我想要鼠标位置以交互方式生成特定于坐标的图像,但 WxPython注册连续运动事件时有约 400 毫秒的延迟。这使得界面迟缓。

为什么EVT_MOTION这么慢,我该如何解决?我在 Ubuntu 11.10 和 WinXP 上试过,延迟差不多?

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

在此处输入图像描述

这是我尝试过的代码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
4

3 回答 3

3

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

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

  1. 如果您自己绘制这些东西,请确保您使用的是双缓冲(通过 wx.BufferedPaintDC);
  2. 如果确实在鼠标运动之间调用了绘制程序,请尝试仅刷新绘图的损坏部分(通过 RefreshRect);
  3. 使用 wx.Overlay 绘制您的矩形选择(有一些演示如何做到这一点);
  4. 发布一个小型、可运行的示例应用程序来演示该问题。
于 2012-06-08T18:40:10.747 回答
2

我们真的需要看看应用程序中发生了什么,才能给你任何有意义的答案,尽管许多人能够在创建一个小样本的过程中自己解决问题,以与他人分享问题.

http://wiki.wxpython.org/MakingSampleApps

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

于 2012-06-08T18:36:17.173 回答
2

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

于 2012-06-06T19:10:12.100 回答