質問

wxPythonノートブック、この場合は wx.aui.AuiNotebook を持っています。 (しかし、この問題は他の種類のノートブックでも発生しました。)ノートブックにはウィジェットがあり、この場合は ScrolledPanel のサブクラスで、カスタムイベント処理を試みています( wx.EVT_KEY_DOWN の場合)。ただし、イベントは処理されていません。ノートブックの外部でコードをチェックし、イベント処理は機能しますが、ウィジェットをノートブックに入れると、イベントが発生したときにイベントハンドラーが呼び出されないようです。

ノートブックは何らかの形でイベントをブロックしますか?これをどうやって解決しますか?

役に立ちましたか?

解決

問題の再現を試みましたが、うまくいきました。考えられる唯一のことは、 wx.EVT_KEY_DOWN にもバインドし、 wx.Event.Skip()をコールバックで。これにより、イベントをさらに処理できなくなります。スクロールされたパネルが、イベントハンドラのシーケンスでこのようなオブジェクトの下流にある場合、イベントは表示されません。

参考のために、ここで私のために働いた例があります(Windowsで)。あなたがやっていることはこれとは大きく異なりますか?

import wx
import wx.aui, wx.lib.scrolledpanel

class AppFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        wx.Frame.__init__(self, *args, **kwds)

        # The notebook
        self.nb = wx.aui.AuiNotebook(self)

        # Create a scrolled panel
        panel = wx.lib.scrolledpanel.ScrolledPanel(self, -1)
        panel.SetupScrolling()
        self.add_panel(panel, 'Scrolled Panel')

        # Create a normal panel
        panel = wx.Panel(self, -1)
        self.add_panel(panel, 'Simple Panel')

        # Set the notebook on the frame
        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.nb, 1, wx.EXPAND)
        self.SetSizer(self.sizer)

        # Status bar to display the key code of what was typed
        self.sb = self.CreateStatusBar()

    def add_panel(self, panel, name):
        panel.Bind(wx.EVT_KEY_DOWN, self.on_key)
        self.nb.AddPage(panel, name)

    def on_key(self, event):
        self.sb.SetStatusText("key: %d [%d]" % (event.GetKeyCode(), event.GetTimestamp()))
        event.Skip()

class TestApp(wx.App):
    def OnInit(self):
        frame = AppFrame(None, -1, 'Click on a panel and hit a key')
        frame.Show()
        self.SetTopWindow(frame)
        return 1

if __name__ == "__main__":
    app = TestApp(0)
    app.MainLoop()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top