I am writing a wxPython application that remains open after closing all of its windows – so you can still drag & drop new files onto the OSX dock icon (I do this with myApp.SetExitOnFrameDelete(False)).
Unfortunately if I close all the windows, the OSX menubar will only contain a “Help” menu. I would like to add at least a File/Open menu item, or just keep the menubar of the main window. Is this somehow possible in wxPython?
In fact, I would be happy with a non-wxPython hack as well (for example, setting the menu in pyobjc, but running the rest of the GUI in wxPython). wxPython development in OSX is such a hack anyway 😉
UPDATE: I managed to solve this problem using the tip from Lyndsey Ferguson. Here’s what I have done:
- On startup I create a window which I show and hide immediately. I set its position to
(-10000,-10000)so that it does not flicker on the screen (aargh, what a dirty hack!) - I create an empty EVT_CLOSE event handler in that window so that it cannot be closed.
- It seems that destroying a window resets the OSX menu, but hiding does not… So when the last window is closed, I need to show and hide this window again (hiding is necessary so that the user cannot switch to this window using the Window menu or Cmd-`)
Yeah, this is really ugly… I will be very grateful if someone comes up with a prettier solution.
UPDATE 2: Actually it can be solved in a much easier way: if we do not close the last window, only hide it. And ensure that it does not respond to menu events anymore.
Can you create a hidden window that is offscreen somewhere? It is a hack, but I remember having to do a lot of hacks to make my wxPython-based application work correctly on Mac OS X.
Note:You’ll have to disable the close button and set up that hidden window so that it doesn’t show up in the Window menu.
Aside:Have you considered factoring out your GUI portion of your Python application and using PyObjC on Mac OS X? You’ll get more native behaviours…