wxPython: обработка событий в виджете внутри ноутбука
-
05-07-2019 - |
Вопрос
У меня есть записная книжка 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()