Question

J'ai un cahier wxPython, dans ce cas un wx.aui.AuiNotebook . (mais ce problème s’est aussi produit avec d’autres types de cahiers.) Dans mon cahier, j’ai un widget, dans ce cas une sous-classe de ScrolledPanel , pour lequel j’essaie de gérer des événements personnalisés ( pour wx.EVT_KEY_DOWN ). Cependant, les événements ne sont pas gérés. J'ai vérifié mon code en dehors du bloc-notes et la gestion des événements fonctionne, mais lorsque je mets mon widget dans le bloc-notes, le gestionnaire d'événements ne semble pas être invoqué lorsque l'événement se produit.

Le bloc-notes bloque-t-il l'événement? Comment résoudre ce problème?

Était-ce utile?

La solution

J'ai essayé de reproduire votre problème, mais cela a bien fonctionné pour moi. La seule chose à laquelle je puisse penser est qu’une de vos classes se lie également à wx.EVT_KEY_DOWN et n’appelle pas wx.Event.Skip () dans son rappel. Cela empêcherait un traitement ultérieur de l'événement. Si votre panneau défilant se trouve en aval d'un tel objet dans la séquence de gestionnaires d'événements, il ne verra jamais l'événement.

Pour référence, voici un exemple qui a fonctionné pour moi (sous Windows). Ce que vous faites est-il bien différent de celui-ci?

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top