2

Ubuntuで動作させようとしているOpenGLwxpythonアプリがあります。Mac OSXで(他の誰かによって)開発され、そこでは問題なく動作します。

私が抱えている最後の未解決の問題は、キーボードイベントがキャプチャされないことです。

コードは次のようになります。

class GLFrame(wx.Frame):
     def __init__(...):
         ...
         self.canvas.Bind(wx.EVT_MOTION, self.mouseMotion)
         self.canvas.Bind(wx.EVT_CHAR, self.character)
         ...

def character(self, evt):
    print "EVT_CHAR"
    # do stuff

def mouseMotion(self, evt):
    print "EVT_MOTION"
    # do stuff

Bind呼び出しのコードベース全体を取得しましたが、EVT_CHAR、EVT_KET_DOWN、またはEVT_KEY_UPを使用しているものは他にありません。また、EVT_KEY_DOWNとEVT_KEY_UPの両方を試しましたが、どちらも機能しません。

からのバインド呼び出しも変更してみました

self.canvas.Bind(...)

self.Bind(...)

これはEVT_MOTIONを壊し、EVT_CHARコールバックはまだ呼び出されません。

GLFrameに到達する前にキーボードイベントをキャプチャする可能性のある呼び出しはありますか?私はwxpythonを初めて使用します。ほとんどの場合、それは私には理にかなっていますが、私が気付いていない「落とし穴」があると確信しています。

4

2 に答える 2

2

wxpython Googleグループによると、wx.Frameがキーボードイベントを受信するかどうかは実装に依存します。Ubuntuの実装はそれらを受け取りません。

差出人:https ://groups.google.com/d/msg/wxpython-users/dF2gf5KvFhE/M_-aRuG3aWUJ

wx.Framesがキーイベントをキャッチできるかどうかは、wxによって定義されていないため、実装に依存します。一部のプラットフォームで機能する可能性があるという事実は、基本的には偶然の一致です。GLCanvasクラスについてはよくわかりませんが、フォーカスがあればできると思います。タイマーなどから「printwx.Window.FindFocus()」などを実行して、フォーカスがどこにあるかを再確認することをお勧めします。

結局のところ、GLCanvasはキーボードイベントを問題なく受信できます。どういうわけか、それは焦点を合わせていませんでした。呼び出し

self.canvas.SetFocus()

問題を修正しました。

于 2012-10-04T17:23:59.173 に答える
0

キャンバスではなくフレームにバインドしてみてください。

class GLFrame(wx.Frame):
    def __init__(self,*args,**kwargs):
        wx.Frame.__init__(self,*args,**kwargs)
        self.Bind(wx.EVT_MOTION, self.mouseMotion)
        self.Bind(wx.EVT_CHAR, self.character)


    def character(self, evt):
        print "EVT_CHAR"
        # do stuff

    def mouseMotion(self, evt):
        print "EVT_MOTION"

a = wx.App(redirect=False)
f = GLFrame(None,-1)
f.Show()
a.MainLoop()
于 2012-09-25T18:07:30.797 に答える