Frage

Ich habe einen WxPython Notebook, in diesem Fall ein wx.aui.AuiNotebook. (Aber dieses Problem hat sich auch mit anderen Arten von Notebooks passiert ist.) In meinem Notebook ich ein Widget haben, in diesem Fall eine Unterklasse von ScrolledPanel, für die ich versuche, einige benutzerdefinierte Event-Handling (für wx.EVT_KEY_DOWN) zu tun. Allerdings sind die Ereignisse, die nicht behandelt werden. Ich habe meinen Code außerhalb des Notebooks, und das Ereignis Arbeiten Handhabung, aber wenn ich mein Widget im Notebook stecken, wird der Event-Handler nicht scheinen, aufgerufen werden, wenn das Ereignis eintritt.

Ist das Notebook irgendwie das Ereignis blockieren? Wie löse ich das?

War es hilfreich?

Lösung

Ich habe versucht, das Problem reproduzieren, aber es funktionierte gut für mich. Das einzige, was ich denken kann, ist, dass es eine Ihrer Klassen, die auch an wx.EVT_KEY_DOWN bindet und ruft nicht wx.Event.Skip () in seinem Rückruf. Das würde die weitere Handhabung des Ereignisses verhindern. Wenn Ihr gescrollt Platte stromabwärts eines solchen Objekts in der Reihenfolge der Event-Handler sein geschieht, wird es nie das Ereignis sehen.

Als Referenz, hier ist ein Beispiel, das für mich gearbeitet (unter Windows). Ist das, was Sie tun viel anders als das?

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top