1

wxPython を使用して開発している GUI アプリケーションの EVT_CHAR イベントをバインドする必要があります。私は次のことを試しましたが、コードの動作を理解できません。

import wx
import wx.lib.agw.flatnotebook as fnb

class DemoApp(wx.App):

    def __init__(self):
        wx.App.__init__(self, redirect=False)

        self.mainFrame = DemoFrame()
        self.mainFrame.Show()

    def OnInit(self):
        return True


class DemoFrame(wx.Frame):

    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "FlatNotebook Tutorial",
                          size=(600,400)
                          )
        panel = wx.Panel(self)
        button = wx.Button(panel, label="Close", pos=(125, 10), size=(50, 50))

        self.Bind(wx.EVT_CHAR, self.character)

    def character(self, event):  
        print "Char keycode : {0}".format(event.GetKeyCode())

if __name__ == "__main__":
    app = DemoApp()
    app.MainLoop()

文字関数が呼び出されることはありません。ただし、Frame コンストラクターへの 2 行の呼び出しをコメント アウトすると、I 文字関数が呼び出されます。フレームにパネルを追加すると、フレームの EVT_CHAR のバインドが妨げられるようです。

この問題に対処するにはどうすればよいですか? コードで何か間違ったことをしていますか?

4

2 に答える 2

3

問題は、フレームに発生するイベントをキャッチしているが、フレームに焦点が合っていないことです。ボタンは。wxPython では、イベントはフォーカスのあるウィジェットに送信されます。これをinitの最後に追加すると、機能します。

self.SetFocus()

ただし、フォーカスをボタンに変更すると、再び機能しなくなります。以下も参照してください。

于 2013-09-06T16:09:52.247 に答える
2

この質問が 2 年前に回答されたことに感謝しますが、この問題はある時点で私たち全員を捕まえます。
これは、wx.Event または wx.CommandEvent の問題への古典的なバインドです。
この場合、self.Bind(wx.EVT_CHAR, self.character)読み取る行を変更するだけbutton.Bind(wx.EVT_CHAR, self.character)で、上記で説明した問題を解決できます。
wx.Event - wx.CommandEvent の問題は、ここで完全にカバーされています:
http://wiki.wxpython.org/EventPropagation
とここ:
http://wiki.wxpython.org/self.Bind%20vs.%20self.button 。練る

于 2015-09-14T08:13:57.983 に答える