= Introduction =
[[http://tix.sourceforge.net/|Tix]], the Tk Interface eXtension, is a powerful set of user interface components that expands the capabilities of your Tcl/Tk and Python applications. This page describes building a "Hello World" Tix application with py2exe.

= Tix Hello World =
Here is a very simple Tix application. Save it as hello.py:

{{{
#!python
import Tix

window = Tix.Tk()
Tix.Label(window, text='Hello World').grid()
window.mainloop()
}}}

= setup.py for hello.py =
py2exe doesn't discover the use of the Tix DLL and Tcl files, so you must include them explicitly. The following setup.py builds a working EXE for the hello.py above:

{{{
#!python
import glob
import os
import sys
from distutils.core import setup
import py2exe

def files(folder):
    for path in glob.glob(folder+'/*'):
        if os.path.isfile(path):
            yield path

data_files=[
            ('.', glob.glob(sys.prefix+'/DLLs/tix81*.dll')),
            ('tcl/tix8.1', files(sys.prefix+'/tcl/tix8.1')),
            ('tcl/tix8.1/bitmaps', files(sys.prefix+'/tcl/tix8.1/bitmaps')),
            ('tcl/tix8.1/pref', files(sys.prefix+'/tcl/tix8.1/pref')),
           ]

setup(
      script_args=['py2exe'],
      windows=['hello.py'],
      data_files=data_files,
     )
}}}

= Alternative setup.py for hello.py =
Another more ellaborated '''setup.py''', without hard-coded versions of libraries and working with the ''bundle_files'' option (dlls for tcl, tk and tix must stand in the exec dir):

{{{
#!python
from distutils.core import setup
import py2exe
from py2exe.build_exe import py2exe as BuildExe
import os,sys

def TixInfo():
    import Tkinter
    import _tkinter
    
    tk=_tkinter.create()
   
    tcl_version=_tkinter.TCL_VERSION
    tk_version=_tkinter.TK_VERSION
    tix_version=tk.call("package","version","Tix")
  
    tcl_dir=tk.call("info","library")
          
    del tk, _tkinter, Tkinter
    
    return (tcl_version,tk_version,tix_version,tcl_dir)

class myPy2Exe(BuildExe):
    
    def plat_finalize(self, modules, py_files, extensions, dlls):
        BuildExe.plat_finalize(self, modules, py_files, extensions, dlls)
        
        if "Tix" in modules:
            # Tix adjustments
            tcl_version,tk_version,tix_version,tcl_dir = TixInfo()
            
            tixdll="tix%s%s.dll"% (tix_version.replace(".",""),
                                    tcl_version.replace(".",""))
            tcldll="tcl%s.dll"%tcl_version.replace(".","")
            tkdll="tk%s.dll"%tk_version.replace(".","")

            dlls.add(os.path.join(sys.prefix,"DLLs",tixdll))
            
            self.dlls_in_exedir.extend( [tcldll,tkdll,tixdll ] )

            tcl_src_dir = os.path.split(tcl_dir)[0]
            tcl_dst_dir = os.path.join(self.lib_dir, "tcl")
            self.announce("Copying TIX files from %s..." % tcl_src_dir)
            self.copy_tree(os.path.join(tcl_src_dir, "tix%s" % tix_version),
                           os.path.join(tcl_dst_dir, "tix%s" % tix_version))

opts={
    'py2exe':{
        'bundle_files':1
    }
}

setup(
    script_args=['py2exe'],
    cmdclass={'py2exe':myPy2Exe},
    windows=['hello.py'],
    options=opts,
)
}}}