8

on_motionを処理するように設定しましたEVT_MOTION。座標固有の画像をインタラクティブに生成するためにマウスの位置が必要ですが、 WxPythonでは連続するモーションイベントの登録に約400msの遅延があります。これにより、インターフェイスが遅くなります。

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

EVT_MOTIONマウスを動かすたびに発火します!その後、すべての動きを呼び出しevent.GetPosition()てデータを処理すると、パフォーマンスが低下します。どのように使用するEVT_LEFT_DOWNか、または同様のものを使用してから、位置を取得してそのデータを処理します。画像の特定の領域のみを検索するため、これははるかに効率的です。

于 2012-06-06T19:10:12.100 に答える
2

多くの人が他の人と共有する問題を示す小さなサンプルを作成する過程で問題を自分で解決することができますが、意味のある答えを与えることができるように、アプリケーションで他に何が起こっているかを実際に確認する必要があります。

http://wiki.wxpython.org/MakingSampleApps

十字線の描画方法やウィンドウのメインコンテンツの更新方法を最適化するのがおそらく最善の策ですが、詳細を共有するまで、私たちにできることは推測だけです。

于 2012-06-08T18:36:17.173 に答える