wxPython: обработка событий в виджете внутри ноутбука - PullRequest
2 голосов
/ 29 июля 2009

У меня есть ноутбук wxPython, в данном случае wx.aui.AuiNotebook. (но эта проблема возникла и с другими типами ноутбуков.) В моем блокноте есть виджет, в данном случае подкласс ScrolledPanel, для которого я пытаюсь выполнить некоторую пользовательскую обработку событий (для wx.EVT_KEY_DOWN) , Однако события не обрабатываются. Я проверил свой код за пределами записной книжки, и обработка событий работает, но когда я помещаю свой виджет в записную книжку, кажется, что обработчик событий не вызывается, когда происходит событие.

Блокнот как-то блокирует событие? Как мне это решить?

1 Ответ

2 голосов
/ 30 июля 2009

Я пытался воспроизвести вашу проблему, но у меня она работала нормально. Единственное, о чем я могу думать, это то, что есть один из ваших классов, который также связывается с 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()
...