wxPython:ノートブック内にあるウィジェットでイベントを処理する
-
05-07-2019 - |
質問
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()
所属していません StackOverflow