Вопрос

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

Записывает ли блокнот событие? Как мне это решить?

Это было полезно?

Решение

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