The way you are headed, scene1.py needs to import from scene and scene2.
scene2 needs to import from scene and scene3.
scene3 needs to import from scene and scene1.
This sets up a nasty circular import, but as long as you don't put any executable code outside of the class statements, which refernces anything that is imported, you should be ok.... although if you forget that rule later, it will make for confusing error messages.
Your main would import from scene1, in order to get access to Scene1 class.
Only the main needs to import from multiscene, since nobody else needs to instantiate a multiscene object.
I would suggest that MultiScene sets the main_scene attribute of new_scene in switch_scene
def switch_scene(self, new_scene):
self.active_scene = new_scene
new_scene.main_scene=self
new_scene.setup()
so that you don't need to rely on globals (the scenes would then use self.main_scene.switch_scene(...))
Another approach that avoids circular imports would be to do all the imports in main, instantiate the scenes, and set a next_scene attribute(for obvious reasons you cannot have this in the constructor, since you would not be able to create all three at once) pointing to the next scene to present. This also makes it easier to stitch together multiple students contributions, since an individual level or whatever does not need to know what level comes next, rather this is defined in main. (you could also def a next_level() in main which cycles through the classes... then each scene simply calls next_level())