2009-07-29 11 views
2

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

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

答えて

2

私はあなたの問題を再現することを試みたが、それは私のために正常に働いた。私が考えることができるのは、クラスのうちの1つが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() 
+0

正しい例です。私の問題はちょっと愚かで無関係だった、私は間違った__init__をどこかで使った。 –

関連する問題