Thread: [Pyobjc-dev] Pure Python Cocoa GUI application?
Brought to you by:
ronaldoussoren
From: Orestis M. <or...@or...> - 2009-03-15 11:16:55
|
Hello, For the purposes of testing an application, running it in the same process as the tests (ie. as part of a unittest run) is essential. However, for Cocoa applications built with PyObjC built with the XCode templates I haven't found a way to do this. As far as I can understand main.m, all it does is using the Python C API to run main.py. However, when I try to run main.py standalone, things fail because there is no bundle. I've tried to do: app = NSApplication.sharedApplication() app.setDelegate_(delegate) app.run() but things crash soon after. Same if I do AppHelper.runEventLoop(). So my question is: Is there any way from pure python (no main.m, no nib) to get something showing on the screen? I know that without a nib I won't get a proper dock icon or a menu bar, but this is going to be a full screen app and thus these things are not needed. I can cope with bundles, but if there could be no bundles that'd be nice as well. Thanks, Orestis -- or...@or... http://orestis.gr/ |
From: Greg E. <gre...@ca...> - 2009-03-15 22:53:07
|
Orestis Markou wrote: > I've tried to do: > > app = NSApplication.sharedApplication() > app.setDelegate_(delegate) > app.run() > > but things crash soon after. That's strange, because I do something very similar in PyGUI and it seems to work. I've only tested it on 10.4, though. It's possible that things are different in 10.5. Have you tried running it with pythonw instead of python? -- Greg |
From: Orestis M. <or...@or...> - 2009-03-16 14:45:29
|
On 15 Mar 2009, at 22:54, Greg Ewing wrote: > Orestis Markou wrote: > >> I've tried to do: >> app = NSApplication.sharedApplication() >> app.setDelegate_(delegate) >> app.run() >> but things crash soon after. > > That's strange, because I do something very similar in > PyGUI and it seems to work. > > I've only tested it on 10.4, though. It's possible that > things are different in 10.5. > > Have you tried running it with pythonw instead of > python? Hm, weird. I did (complete file): from Foundation import * from AppKit import * class Delegate(NSObject): def applicationDidFinishLaunching_(self, sender): NSLog('DID FINISH LAUNCHING') NSLog('launching') app = NSApplication.sharedApplication() delegate = Delegate.alloc().init() app.setDelegate_(delegate) app.run() and it seemed to work. I think I may have alloc'ed the delegate and not bound it to a name, so it got GC'ed and then things crashed. Thanks! Now, to get a window up... Orestis |
From: Ronald O. <ron...@ma...> - 2009-03-17 07:34:16
Attachments:
smime.p7s
|
On 15 Mar, 2009, at 12:11, Orestis Markou wrote: > Hello, > > For the purposes of testing an application, running it in the same > process as the tests (ie. as part of a unittest run) is essential. > However, for Cocoa applications built with PyObjC built with the XCode > templates I haven't found a way to do this. As far as I can understand > main.m, all it does is using the Python C API to run main.py. However, > when I try to run main.py standalone, things fail because there is no > bundle. > > I've tried to do: > > app = NSApplication.sharedApplication() > app.setDelegate_(delegate) > app.run() > > but things crash soon after. Same if I do AppHelper.runEventLoop(). > > So my question is: Is there any way from pure python (no main.m, no > nib) to get something showing on the screen? I know that without a nib > I won't get a proper dock icon or a menu bar, but this is going to be > a full screen app and thus these things are not needed. I can cope > with bundles, but if there could be no bundles that'd be nice as well. This should be possible, see: http://svn.red-bean.com/pyobjc/trunk/pyobjc/pyobjc-core/Examples/Scripts/HelloWorld.py Most PyObjC examples use py2app to build the application bundle, which includes it's own stub executable into the .app bundle. The Xcode projects use a main.m file because that's needed for Xcode. Ronald > > Thanks, > Orestis > -- > or...@or... > http://orestis.gr/ > > > > > > ------------------------------------------------------------------------------ > Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) > are > powering Web 2.0 with engaging, cross-platform capabilities. Quickly > and > easily build your RIAs with Flex Builder, the Eclipse(TM)based > development > software that enables intelligent coding and step-through debugging. > Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com > _______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev |
From: Greg E. <gre...@ca...> - 2009-03-17 10:48:46
|
Ronald Oussoren wrote: > > Is there any way from pure python (no main.m, no >> nib) to get something showing on the screen? I know that without a nib >> I won't get a proper dock icon or a menu bar, It's possible to get a proper menu bar without a nib using a trick or two. Let me know if you want details. -- Greg |
From: Orestis M. <or...@or...> - 2009-03-31 10:06:26
|
Hi, I'm a bit confused about Dock icons and applications - some times I get the rocket icon, which I can use to force quit the app, some times I don't get anything and I have to kill the process by getting the PID. How can I get the standard application behaviour with no nibs? Orestis -- or...@or... http://orestis.gr/ On 17 Mar 2009, at 10:50, Greg Ewing wrote: > Ronald Oussoren wrote: >> >> Is there any way from pure python (no main.m, no >>> nib) to get something showing on the screen? I know that without a >>> nib >>> I won't get a proper dock icon or a menu bar, > > It's possible to get a proper menu bar without a nib > using a trick or two. Let me know if you want details. > > -- > Greg > > ------------------------------------------------------------------------------ > Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) > are > powering Web 2.0 with engaging, cross-platform capabilities. Quickly > and > easily build your RIAs with Flex Builder, the Eclipse(TM)based > development > software that enables intelligent coding and step-through debugging. > Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com > _______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev |
From: Orestis M. <or...@or...> - 2009-03-31 09:52:53
|
Interesting - I'm using virtualenv, and when using the python executable created by virtualenv I don't get the dock icon, whereas if I use the system python executable I do. I wonder if there's a way to overcome this... -- or...@or... http://orestis.gr/ On 31 Mar 2009, at 10:39, Orestis Markou wrote: > Hi, > > I'm a bit confused about Dock icons and applications - some times I > get the rocket icon, which I can use to force quit the app, some > times I don't get anything and I have to kill the process by getting > the PID. > > How can I get the standard application behaviour with no nibs? > > Orestis > -- > or...@or... > http://orestis.gr/ > > > > > On 17 Mar 2009, at 10:50, Greg Ewing wrote: > >> Ronald Oussoren wrote: >>> >>> Is there any way from pure python (no main.m, no >>>> nib) to get something showing on the screen? I know that without >>>> a nib >>>> I won't get a proper dock icon or a menu bar, >> >> It's possible to get a proper menu bar without a nib >> using a trick or two. Let me know if you want details. >> >> -- >> Greg >> >> ------------------------------------------------------------------------------ >> Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) >> are >> powering Web 2.0 with engaging, cross-platform capabilities. >> Quickly and >> easily build your RIAs with Flex Builder, the Eclipse(TM)based >> development >> software that enables intelligent coding and step-through debugging. >> Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com >> _______________________________________________ >> Pyobjc-dev mailing list >> Pyo...@li... >> https://lists.sourceforge.net/lists/listinfo/pyobjc-dev > |
From: Greg E. <gre...@ca...> - 2009-03-31 11:10:54
|
Orestis Markou wrote: > I'm a bit confused about Dock icons and applications - some times I get > the rocket icon, some times I don't Is it python vs. pythonw? I find I need to use pythonw in order to get a dock icon. -- Greg |
From: Orestis M. <or...@or...> - 2009-03-31 11:23:37
|
On 31 Mar 2009, at 12:12, Greg Ewing wrote: > Orestis Markou wrote: > >> I'm a bit confused about Dock icons and applications - some times >> I get the rocket icon, some times I don't > > Is it python vs. pythonw? I find I need to use pythonw > in order to get a dock icon. pythonw does display the dock icon (and virtualenv doesn't copy that, I'll raise an issue). I'm more interested in having a menubar so I can press command-Q to exit. For some reason ctrl-c doesn't work, even when using the relevant AppHelper method (AppHelper.installMachInterrupt()). Orestis > -- > Greg |
From: Ronald O. <ron...@ma...> - 2009-03-31 13:42:23
Attachments:
smime.p7s
|
On 31 Mar, 2009, at 4:46, Orestis Markou wrote: > Interesting - I'm using virtualenv, and when using the python > executable created by virtualenv I don't get the dock icon, whereas if > I use the system python executable I do. I wonder if there's a way to > overcome this... The python executable in a virtualenv is not equivalent to "pythonw" while the regular one is. That is, the executable that gets started when you start python outside of a virtual env is one that's located in an .app bundle (check sys.executable for evidence). I'll probably get around to fixing virtualenv in the near future as I'm about to move my development environment to something that's entirely based on clean installs of Python with per-project virtual environments. I've looked into such a fix in the past as well and getting the semantics of virtualenv exactly right could be a challenge, but still doable. Ronald |
From: Ronald O. <ron...@ma...> - 2009-03-31 13:45:26
Attachments:
smime.p7s
|
On 31 Mar, 2009, at 4:39, Orestis Markou wrote: > Hi, > > I'm a bit confused about Dock icons and applications - some times I > get the rocket icon, which I can use to force quit the app, some times > I don't get anything and I have to kill the process by getting the > PID. > > How can I get the standard application behaviour with no nibs? The most important bit is to make sure your application is in an .app bundle and has a proper main loop. That way you'll get real access to the Window Manager and an icon in the Dock. OSX wants all GUI programs to run as part of a .app bundle (ignoring CFM based Carbon apps because nobody should use those anyway), you won't get the right experience otherwise. Python hacks around that by using a Python.app bundle inside the Python framework, but that's only there as a convenience to users and shouldn't be used for packaging real applications (IMHO). Ronald |
From: Ronald O. <ron...@ma...> - 2009-03-31 13:46:37
Attachments:
smime.p7s
|
On 31 Mar, 2009, at 6:12, Greg Ewing wrote: > Orestis Markou wrote: > >> I'm a bit confused about Dock icons and applications - some times >> I get >> the rocket icon, some times I don't > > Is it python vs. pythonw? I find I need to use pythonw > in order to get a dock icon. Both should work the same on recent versions of Python (at worst starting at 2.6, I haven't check 2.5 but IIRC even there python and pythonw are the same executable). Ronald |
From: Greg E. <gre...@ca...> - 2009-03-31 22:38:29
|
Orestis Markou wrote: > pythonw does display the dock icon (and virtualenv doesn't copy that, > I'll raise an issue). I'm more interested in having a menubar so I can > press command-Q to exit. I don't know what's up with that. Even using pythonw, I've never been able to get the stock Quit menu item that the interpreter gives you to work. In PyGUI I'm creating all of my own menus (including the application menu) and handling them myself. > For some reason ctrl-c doesn't work, even when > using the relevant AppHelper method (AppHelper.installMachInterrupt()). Control-backslash in the Terminal window seems to work for me (I think that sends a SIGQUIT instead of a SIGINT). -- Greg |
From: Greg E. <gre...@ca...> - 2009-03-31 23:01:12
|
Ronald Oussoren wrote: > Both should work the same on recent versions of Python (at worst > starting at 2.6, I haven't check 2.5 but IIRC even there python and > pythonw are the same executable). On further investigation, it seems you're right. I was sure I had a situation just recently where python wouldn't give me a dock icon, but I can't seem to reproduce it now. The part about it being inside an app bundle doesn't seem to be right, though, at least for 2.5: % which pythonw /usr/local/bin/pythonw % ls -l /usr/local/bin/pythonw lrwxr-xr-x 1 root wheel 61 Apr 8 2007 /usr/local/bin/pythonw -> /Library/Frameworks/Python.framework/Versions/2.5/bin/pythonw -- Greg |
From: Ronald O. <ron...@ma...> - 2009-03-31 23:23:00
Attachments:
smime.p7s
|
On 31 Mar, 2009, at 18:02, Greg Ewing wrote: > Ronald Oussoren wrote: > >> Both should work the same on recent versions of Python (at worst >> starting at 2.6, I haven't check 2.5 but IIRC even there python and >> pythonw are the same executable). > > On further investigation, it seems you're right. I was sure > I had a situation just recently where python wouldn't give > me a dock icon, but I can't seem to reproduce it now. > > The part about it being inside an app bundle doesn't seem > to be right, though, at least for 2.5: We're way more sneaky than that ;-). If you look carefully you'll notice that the pythonw executable is tiny and doesn't actually link with the Python framework. That's because this executable has just one task: exec-ing the executable inside the Python.app application. This is needed to ensure that the C-level argv[0] contains a path that is an absolute path that contains proof that we're inside a .app bundle. We cannot tweak argv[0] inside a running application, Apple's framework fetch the value of argv[0] from some other, hidden and undocumented, location. That's why the executable inside virtualenv environments behaves differently, that executable is the one that is normally inside the "Python.app" bundle. Ronald |
From: Ronald O. <ron...@ma...> - 2009-03-31 23:30:08
Attachments:
smime.p7s
|
On 31 Mar, 2009, at 17:40, Greg Ewing wrote: > Orestis Markou wrote: > >> pythonw does display the dock icon (and virtualenv doesn't copy that, >> I'll raise an issue). I'm more interested in having a menubar so I >> can >> press command-Q to exit. > > I don't know what's up with that. Even using pythonw, > I've never been able to get the stock Quit menu item that > the interpreter gives you to work. In PyGUI I'm creating > all of my own menus (including the application menu) and > handling them myself. That doesn't surprise me at all. You get the Quit menu item for free, but as Python doesn't run an eventloop itself it won't notice that the menu-item is selected. That's why you have to run your own eventloop to get nice gui behaviour. > >> For some reason ctrl-c doesn't work, even when >> using the relevant AppHelper method >> (AppHelper.installMachInterrupt()). > > Control-backslash in the Terminal window seems to work > for me (I think that sends a SIGQUIT instead of a SIGINT). IIRC CTRL+C only works when your application hits Python once in a while. Ronald |