2012-06-01 14 views
8

Configuré on_motion para manejar EVT_MOTION. Quiero la ubicación del mouse para de forma interactiva generando una imagen específica de la coordenada, pero WxPython tiene un retraso de ~ 400ms al registrar sucesos de movimiento sucesivos. Lo que hace que la interfaz sea lenta.¿Por qué la detección de movimiento de WxPythons es tan lenta?

¿Por qué es tan lento EVT_MOTION y cómo lo arreglo? Lo intenté en Ubuntu 11.10 y WinXP y los retrasos son comparables?

Necesito tiempos de respuesta rápidos para seleccionar una parte de una imagen como la que muestra la imagen. Tal como está, las "crucetas" siguen al mouse muy lentamente.

enter image description here

Este es el código que probé 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 
+1

¿Podría haber otros eventos que se están manejando en el medio? tal vez algún dibujo caro que está sucediendo tal vez – GP89

+1

Me gustaría publicar de forma cruzada para el grupo de wxPython Google. Y publique un pequeño ejemplo ejecutable también. –

+2

¿Ha considerado crear un hilo dedicado solo al rastreo del mouse?Un bucle contiguo de "¿dónde está el mouse ?, dispara la actualización, repite". Si el problema es EVT_MOTION, esto lo resolverá. Si el problema es la velocidad de dibujo, entonces debería poder ver eso también. – acattle

Respuesta

3

La pregunta tal como está es incompleta, ya que no hay una aplicación de muestra para demostrar el problema. Sin embargo, diría que el controlador de movimiento no tiene nada que ver con su problema, porque lo más probable es que esté haciendo una operación costosa entre los manejadores de movimiento posteriores (como refrescar todo el lienzo de dibujo).

Si este es el caso (y se puede comprobar fácilmente si su rutina de pintura se llama entre los eventos de movimiento del ratón), sugeriría lo siguiente:

  1. Si el dibujo que cosas usted mismo, asegúrese de que usted está utilizando doble buffering (a través de wx.BufferedPaintDC);
  2. Si su rutina de pintura se llama realmente entre los movimientos del mouse, intente y actualice solo la parte dañada de su trazado (a través de RefreshRect);
  3. Use wx.Overlay para dibujar su selección rectangular (hay algunas demostraciones disponibles sobre cómo hacerlo);
  4. Publica una pequeña aplicación de muestra ejecutable que demuestre el problema.
+0

Sí, fue una operación de dibujo cara que necesita 0,35 segundos. Lo reduje a 0.1 y es más suave. Supuse que la detección de eventos funciona de forma asíncrona con respecto al dibujo (y funciona como verdadero multihilo). Y llamo a 'Refresh()' cada vez que adquiero una nueva imagen. – aitchnyu

2

El EVT_MOTION se dispara cada vez que el ratón se mueve! Si luego llama al event.GetPosition() en cada movimiento y también procesa los datos, esto disminuirá el rendimiento. ¿Cómo sería usar EVT_LEFT_DOWN o algo similar, y luego obtener la posición y procesar esa información. Esto será mucho más eficiente ya que solo está buscando un área determinada de la imagen.

+0

_ "Si luego llama a event.GetPosition() en cada movimiento y también procesa los datos" _ explique sobre esto. Necesito guías para identificar el punto de mira, al menos cuando el usuario se acerca (con su puntero) al punto deseado. – aitchnyu

+1

En ese caso, necesitaría hacer su "código de dibujo" más rápido. Intente comentar cosas y vea si la velocidad está mejorando. Si no puede hacerlo más rápido en un solo hilo, intente agregar otro. –

2

Realmente necesitaremos ver qué más está sucediendo en la aplicación para poder darle respuestas significativas, aunque muchas personas pueden resolver los problemas ellos mismos en el proceso de crear una pequeña muestra que demuestra el problema para compartir con otros

http://wiki.wxpython.org/MakingSampleApps

Optimización de la forma en que está dibujando el punto de mira y/o cómo se está actualizando el contenido principal de la ventana es probablemente la mejor opción, pero hasta que compartir más detalles todo lo que podemos hacer es adivinar.

Cuestiones relacionadas