Browse Source

deploy-ng: make Tkinter work for Windows non-cross-builds

This is only a temporary solution, since this only supports one platform.  We may have to pack the .tcl files into the panda3d .whl archive.
rdb 7 năm trước cách đây
mục cha
commit
b6f2919420
1 tập tin đã thay đổi với 47 bổ sung0 xóa
  1. 47 0
      direct/src/showutil/dist.py

+ 47 - 0
direct/src/showutil/dist.py

@@ -87,6 +87,21 @@ import __builtin__
 __builtin__.__import__ = __import__
 __builtin__.__file__ = sys.executable
 del __builtin__
+
+# Set the TCL_LIBRARY directory to the location of the Tcl/Tk/Tix files.
+import os
+tcl_dir = os.path.join(os.path.dirname(sys.executable), 'tcl')
+if os.path.isdir(tcl_dir):
+    for dir in os.listdir(tcl_dir):
+        sub_dir = os.path.join(tcl_dir, dir)
+        if os.path.isdir(sub_dir):
+            if dir.startswith('tcl'):
+                os.environ['TCL_LIBRARY'] = sub_dir
+            if dir.startswith('tk'):
+                os.environ['TK_LIBRARY'] = sub_dir
+            if dir.startswith('tix'):
+                os.environ['TIX_LIBRARY'] = sub_dir
+del os
 """
 
 # site.py for Python 3.
@@ -114,6 +129,21 @@ def find_spec(fullname, path=None, target=None):
     return spec
 
 FrozenImporter.find_spec = find_spec
+
+# Set the TCL_LIBRARY directory to the location of the Tcl/Tk/Tix files.
+import os
+tcl_dir = os.path.join(os.path.dirname(sys.executable), 'tcl')
+if os.path.isdir(tcl_dir):
+    for dir in os.listdir(tcl_dir):
+        sub_dir = os.path.join(tcl_dir, dir)
+        if os.path.isdir(sub_dir):
+            if dir.startswith('tcl'):
+                os.environ['TCL_LIBRARY'] = sub_dir
+            if dir.startswith('tk'):
+                os.environ['TK_LIBRARY'] = sub_dir
+            if dir.startswith('tix'):
+                os.environ['TIX_LIBRARY'] = sub_dir
+del os
 """
 
 SITE_PY = SITE_PY3 if sys.version_info >= (3,) else SITE_PY2
@@ -575,6 +605,23 @@ class build_apps(setuptools.Command):
             target_path = os.path.join(builddir, basename)
             self.copy_with_dependencies(source_path, target_path, search_path)
 
+        # Copy over the tcl directory.
+        #TODO: get this to work on non-Windows platforms.
+        if sys.platform == "win32" and platform.startswith('win'):
+            tcl_dir = os.path.join(sys.prefix, 'tcl')
+            tkinter_name = 'tkinter' if sys.version_info >= (3, 0) else 'Tkinter'
+
+            if os.path.isdir(tcl_dir) and tkinter_name in freezer_modules:
+                self.announce('Copying Tcl files', distutils.log.INFO)
+                os.makedirs(os.path.join(builddir, 'tcl'))
+
+                for dir in os.listdir(tcl_dir):
+                    sub_dir = os.path.join(tcl_dir, dir)
+                    if os.path.isdir(sub_dir):
+                        target_dir = os.path.join(builddir, 'tcl', dir)
+                        self.announce('copying {0} -> {1}'.format(sub_dir, target_dir))
+                        shutil.copytree(sub_dir, target_dir)
+
         # Extract any other data files from dependency packages.
         for module, paths in PACKAGE_DATA_DIRS.items():
             if module not in freezer_modules: