[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