2012-06-01 13 views
8

on_motionEVT_MOTIONに設定しました。 のマウスの位置を対話的ににすると、座標に固有の画像が生成されますが、WxPythonには連続するモーションイベントの登録が遅れて〜400msになります。インターフェイスが遅くなります。なぜWxPythonsの動き検出が遅いのですか?

なぜ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 
+1

間に処理される他のイベントでもかまいませんか?多分、おそらく高価な図面があるかもしれません。 – GP89

+1

私はwxPython Google Groupにクロスポストします。また、小さな実行可能な例も投稿してください。 –

+2

あなたはマウスを追跡するためだけに専用のスレッドを作成することを検討しましたか?"マウスはどこにありますか?トリガアップデート。リピート"のcosntantループです。問題がEVT_MOTIONの場合、これで解決されます。問題がスピードを引き出している場合は、それも見ることができるはずです。 – acattle

答えて

3

問題を示すサンプルアプリケーションがないため、そのままの質問は不完全です。しかし、モーションハンドラはあなたの問題とは何の関係もないと思います。後続のモーションハンドラ間で高価な操作をしている可能性が高いからです(あなたの描画キャンバス全体をリフレッシュするなど)。これは、(あなたのペイントルーチンがマウスモーションイベントの間で呼び出された場合、あなたは簡単に確認することができます)の場合であれば、私は次のことを示唆している

  1. 自分を詰め込む図面は、あなたがしていることを確認した場合ダブルバッファリング(wx.BufferedPaintDC経由)を使用します。
  2. 実際にマウスの動きの間にペイントルーチンが呼び出された場合は、(RefreshRectを使用して)プロットの破損部分だけを試してみてください。
  3. wx.Overlayを使用して長方形の選択を描画します(その方法についてはいくつかのデモがあります)。
  4. 問題を示す小さな、実行可能なサンプルアプリケーションを投稿してください。
+0

はい、それは0.35秒が必要な高価な描画操作でした。私はそれを0.1とそのスムーズに守りました。私は、イベント検出が図面に関して非同期に動作することを想定していました(真のマルチスレッドと同様に動作します)。私は新しいイメージを取得するたびに 'Refresh()'を呼び出します。 – aitchnyu

2

EVT_MOTIONマウスが移動するたびに解雇されました!すべての動きでevent.GetPosition()と呼び出してデータを処理すると、パフォーマンスが低下します。 EVT_LEFT_DOWNなどを使用して、その位置を取得してそのデータを処理するにはどうすればよいでしょうか。 イメージの特定の領域だけを探しているので、これはずっと効率的です。

+0

_ "すべての動きでevent.GetPosition()を呼び出し、データを処理する場合は、_これを詳しく記述してください。私は十字線を特定するためのガイドを必要とし、ユーザが(ポインタで)目的地に近づくと少なくともatleast。 – aitchnyu

+1

その場合は、あなたの "描画コード"を速くする必要があります。コメントを付けて、スピードが向上しているかどうかを確認してください。単一のスレッドで高速化できない場合は、別のスレッドを追加してみてください。 –

2

問題を示す小さなサンプルを作成する過程で多くの人が問題を解決することができますが、アプリケーションで何が起こっているのかを実際に知る必要があります他の人と分かち合う。あなたは十字線を描いている、および/またはどのようにウィンドウの主な内容をリフレッシュする方法を最適化

http://wiki.wxpython.org/MakingSampleApps

は、おそらくあなたの最善の策ですが、あなたはより多くの細部を共有するまで、私たちにできることすべては推測です。

関連する問題