This is going to be a generic question.
I am struggling in designing a GUI application, esp. with dealing with interactions between different parts.
I don't know how I should deal with shared state. On one hand, shared state is bad, and things should be as explicit as possible. On the other hand, not having shared state introduces unwanted coupling between components.
An example:
I want my application to be extendable in an Emacs/Vim sort of way, via scripts. Clearly, some sort of shared state needs to be modified, so that the GUI will use it. My initial plan was having a global "session" that is accessible from everywhere, but I'm not so sure about it.
One tricky use case is key bindings. I want the user to be able to specify custom keybindings from a script. Each keybinding maps to an arbitrary command, that receives the session as the only argument.
Now, the editor component captures keypresses. It has to have access to the keymappings, which are per-session, so it needs access to the session. Is coupling the editor to the session a good idea? Other components will also need to access the keybindings, so the session now becomes shared and can be a singleton...
Is there any good reading about designing GUI applications that goes beyond MVC?
This is Python and wxPython, FWIW.
[EDIT]: Added concrete usecase.
If you've looked at MVC you're probably moving in the right direction.  MVC, MVP, Passive View, Supervising Controller.  Those are all different ways, each with their own pros and cons, of accomplishing what you're after.  I find that Passive View is the "ideal", but it causes you to introduce far too many widgets into your GUI interfaces (i.e. IInterface).  In general I find that Supervising Controller is a good compromise.
Organising a GUI application