Domanda

Ho un notebook wxPython, in questo caso un wx.aui.AuiNotebook . (ma questo problema si è verificato anche con altri tipi di notebook.) Nel mio notebook ho un widget, in questo caso una sottoclasse di ScrolledPanel , per la quale sto cercando di eseguire una gestione personalizzata degli eventi ( per wx.EVT_KEY_DOWN ). Tuttavia, gli eventi non vengono gestiti. Ho controllato il mio codice al di fuori del notebook e la gestione degli eventi funziona, ma quando inserisco il mio widget nel notebook, il gestore dell'evento non sembra essere invocato quando si verifica l'evento.

Il notebook in qualche modo blocca l'evento? Come posso risolverlo?

È stato utile?

Soluzione

Ho provato a riprodurre il tuo problema, ma ha funzionato bene per me. L'unica cosa che mi viene in mente è che esiste una delle tue classi che si lega anche a wx.EVT_KEY_DOWN e non chiama wx.Event.Skip () nel suo callback. Ciò impedirebbe l'ulteriore gestione dell'evento. Se il tuo pannello fatto scorrere si trova a valle di un tale oggetto nella sequenza dei gestori di eventi, non vedrà mai l'evento.

Per riferimento, ecco un esempio che ha funzionato per me (su Windows). Quello che stai facendo è molto diverso da questo?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top