[Pythonmac-SIG] py2app and universal TkAqua

Bob Ippolito bob at redivi.com
Thu Jul 13 23:01:22 CEST 2006


On Jul 13, 2006, at 1:44 PM, Kevin Walzer wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Bob Ippolito wrote:
>>
>> On Jul 6, 2006, at 4:06 PM, Kevin Walzer wrote:
>>
>>> I have been unable to build the "hello-tk" demo that ships with  
>>> py2app
>>> if I am building against a "universal" build of Tcl/Tk.
>>>
>>> Here is my setup:
>>>
>>> from distutils.core import setup
>>> import py2app
>>>
>>> setup(
>>>     app=['hello.py'],
>>>     options=dict(
>>>         py2app=dict(
>>>             archs="ppc,i386",
>>>
>>> frameworks=["/Library/Frameworks/Tcl.framework","/Library/ 
>>> Frameworks/Tk.framework"]
>>>
>>>             )
>>>         )
>>>     )
>>
>> I gave up on that broken universal support in 0.2.x and cleaned up  
>> what
>> I had in the trunk (0.3). The way it hooks into distutils now (via
>> setuptools) is totally different so it needs a change to your  
>> setup files.
>>
>> 1. remove your existing installation of py2app::
>>
>>     rm -rf
>> /Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/ 
>> py2app
>>     rm
>> /Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/ 
>> py2app.pth
>>
>> 2. install setuptools
>> <http://bob.pythonmac.org/archives/2006/01/17/single-line- 
>> setuptools-install/>
>>
>> 3. sudo easy_install py2app
>> 4. Change the setup.py::
>>
>>     # used to be "from distutils.core import setup"
>>     from setuptools import setup
>>     setup(
>>         app=['hello.py'],
>>         # this is actually useless...
>>         options=dict(py2app=dict(frameworks=['Tcl', 'Tk'])),
>>         # this is new
>>         setup_requires=['py2app'],
>>     )
>>
>> Explicitly specifying the Tcl and Tk frameworks is pointless  
>> because the
>> Tkinter extension either links to them or it doesn't. If it does  
>> link to
>> them, py2app will find them and include them. If it doesn't link  
>> to them
>> (or it links to the /System version, for example) then it still won't
>> use them even if they are present in the app bundle.
>>
>> FYI, the repositories for py2app, macholib, bdist_mpkg, altgraph have
>> all moved to svn.pythonmac.org, e.g.:
>> http://svn.pythonmac.org/py2app/py2app/trunk/
>>
>> I didn't bother trying to preserve the history, so don't bother  
>> trying
>> to svn switch.
>>
>> -bob
>>
>
> This new approach seems to work well. I've tested it not just with the
> basic demo but with a different script that incorporates a Tk-specific
> extension with a Python wrapper (Tile). Thank you.
>
> My only reason for wanting to use a universal build of Tcl/Tk is to
> avoid things breaking if the application runs on a later version of  
> OS X
> with a later version of Tcl/Tk installed in /System. Can the tkinter
> module accommodate a later 8.4.x build of Tcl/Tk without breaking?

It probably can, but you'd have to jigger its install_name in order  
to make that happen.

In your project you could probably do this:

cp `python -c 'print __import__("_tkinter").__file__'` .
install_name_tool \
     -change /System/Library/Frameworks/Tcl.framework/Versions/8.4/Tcl \
             /Library/Frameworks/Tcl.framework/Versions/8.4/Tcl \
     -change /System/Library/Frameworks/Tk.framework/Versions/8.4/Tk \
             /Library/Frameworks/Tk.framework/Versions/8.4/Tk \
     _tkinter.so

That will make a copy of _tkinter.so and rewrite its load commands  
such that it points at your version of Tcl/Tk instead of the  
system's. Since it will be a sibling of your main script, it will be  
on sys.path before the standard library and py2app should pick it up  
instead of the stdlib version of _tkinter. macholib will see the Tcl  
and Tk frameworks and should do the right thing.

-bob



More information about the Pythonmac-SIG mailing list