2

wx.TextCtrl があり、入力できるようにしたいのですが、UP、DOWN、RETURN、ESC などのキーの押下も検出します。

そこで、wx.EVT_KEY_DOWN をバインドしてキーの押下を認識し、wx.EVT_CHAR_HOOK をバインドして、TextCtrl にフォーカスがある場合でも同じことを行います。

self.Bind(wx.EVT_KEY_DOWN, self.keyPressed)
self.Bind(wx.EVT_CHAR_HOOK, self.keyPressed)

キーの押下 UP、DOWN、RETURN、ESC は認識され、正常に動作していましたが、EVT_CHAR_HOOK をバインドしているため、TextCtrl を入力するときに LEFT RIGHT BACKSPACE SHIFT を使用できなくなりました。

助言がありますか?

4

1 に答える 1

3

event.Skip()イベント ハンドラーの最後で呼び出して、それをさらに伝達する必要があります。これは私のために働く:

import wx

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.panel = wx.Panel(self)
        self.text = wx.TextCtrl(self.panel)
        self.text.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.text.Bind(wx.EVT_KEY_UP, self.OnKeyUp)

        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.text, 1)

        self.panel.SetSizerAndFit(self.sizer)  
        self.Show()

    def OnKeyDown(self, e):      
        code = e.GetKeyCode()
        if code == wx.WXK_ESCAPE:
            print("Escape")
        if code == wx.WXK_UP:
            print("Up")
        if code == wx.WXK_DOWN:
            print("Down")
        e.Skip()

    def OnKeyUp(self, e):
        code = e.GetKeyCode()
        if code == wx.WXK_RETURN:
            print("Return")
        e.Skip()


app = wx.App(False)
win = MainWindow(None)
app.MainLoop()
于 2013-12-06T09:02:45.727 に答える