@B-Baer: Du übergibst deinem Panel als Parent den Frame. In ein Notebook kannst du allerdings nur Panels einhängen, die das Notebook als Parent haben. (Das hat Dav1d wohl übersehen)
Du müßtest dem Panel zusätzlich zum Frame auch noch das Notebook übergeben und das Panel dann mit diesem Notebook initialisieren?!
Ich kann allerdings cofi (auch aus der Erfahrung mit eigenen Projekten

) nur zustimmen:
sowas deutet auf einen, vorsichtig ausgedrückt, suboptimalen Entwurf hin und sollte höchstens bei klitzekleinen Quick-and-Dirty - Sachen eingesetzt werden. Ansonsten läuft man schnell in Gefahr, verworrenen Code zu produzieren, den kein Mensch (man selber eingeschlossen) jemals wieder versteht, sobald er das erste Mal vergessen wurde...
Wenn du dein Programm aus dem Grund schreibst, um Python und wxPython zu lernen, solltest du deshalb dein Programmdesign überdenken.
Eine mögliche Ausnahme ist allerdings, wenn du ein Control entwickelst und möchtest der großen, weiten Welt Mitteilungen machen. Dafür nimmt man dann aber keine durchgereichten Objektverweise oder Callbacks, sondern Events. Dann ist die Frage hier sogar OnTopic

Deshalb hier ein Minimalbeispiel (basiert auf einem Tutorial, Quelle habe ich nicht mehr, das ich gekürzt habe):
Code: Alles auswählen
#!/usr/bin/env python
import wx
import wx.lib.newevent
# Eventklasse und Eventbinder erzeugen
MyEvent,EVT_MYEVENT = wx.lib.newevent.NewEvent()
class MyPanel(wx.Panel):
def __init__(self, *args, **kwargs):
wx.Panel.__init__(self, *args, **kwargs)
self.Bind(wx.EVT_LEFT_DOWN, self. on_left_down)
def on_left_down(self, e):
# Event erzeugen, das Panel als Ausloeser setzen und abschicken
evt = MyEvent()
evt.SetEventObject(self)
self.ProcessEvent(evt)
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.wnd = MyPanel(self)
self.wnd.Bind(EVT_MYEVENT, self.on_myevent)
def on_myevent(self, e):
wx.MessageBox('MyEvent angekommen!')
app = wx.App()
frm = MyFrame(None)
frm.Show()
app.MainLoop()