[Python-checkins] cpython (3.2): Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of

ned.deily python-checkins at python.org
Wed Jul 6 04:12:12 CEST 2011


http://hg.python.org/cpython/rev/b58b0c5c7e96
changeset:   71242:b58b0c5c7e96
branch:      3.2
parent:      71233:807921ba241d
user:        Ned Deily <nad at acm.org>
date:        Tue Jul 05 19:09:37 2011 -0700
summary:
  Issue #8716: Instead of relying on Aqua Tk exceptions to detect lack of
OS X window manager connection in tk tests, use OS X Application Services
API calls instead.

files:
  Lib/tkinter/test/support.py |  60 ++++++++++++++----------
  1 files changed, 35 insertions(+), 25 deletions(-)


diff --git a/Lib/tkinter/test/support.py b/Lib/tkinter/test/support.py
--- a/Lib/tkinter/test/support.py
+++ b/Lib/tkinter/test/support.py
@@ -1,38 +1,48 @@
-import subprocess
 import sys
-from test import support
 import tkinter
 import unittest
 
-_tk_available = None
+_tk_unavailable = None
 
 def check_tk_availability():
     """Check that Tk is installed and available."""
-    global _tk_available
+    global _tk_unavailable
 
-    if _tk_available is not None:
-        return
+    if _tk_unavailable is None:
+        _tk_unavailable = False
+        if sys.platform == 'darwin':
+            # The Aqua Tk implementations on OS X can abort the process if
+            # being called in an environment where a window server connection
+            # cannot be made, for instance when invoked by a buildbot or ssh
+            # process not running under the same user id as the current console
+            # user.  To avoid that, raise an exception if the window manager
+            # connection is not available.
+            from ctypes import cdll, c_int, pointer, Structure
+            from ctypes.util import find_library
 
-    if sys.platform == 'darwin':
-        # The Aqua Tk implementations on OS X can abort the process if
-        # being called in an environment where a window server connection
-        # cannot be made, for instance when invoked by a buildbot or ssh
-        # process not running under the same user id as the current console
-        # user.  Instead, try to initialize Tk under a subprocess.
-        p = subprocess.Popen(
-                [sys.executable, '-c', 'import tkinter; tkinter.Button()'],
-                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        stderr = support.strip_python_stderr(p.communicate()[1])
-        if stderr or p.returncode:
-            raise unittest.SkipTest("tk cannot be initialized: %s" % stderr)
-    else:
-        try:
-            tkinter.Button()
-        except tkinter.TclError as msg:
-            # assuming tk is not available
-            raise unittest.SkipTest("tk not available: %s" % msg)
+            app_services = cdll.LoadLibrary(find_library("ApplicationServices"))
 
-    _tk_available = True
+            if app_services.CGMainDisplayID() == 0:
+                _tk_unavailable = "cannot run without OS X window manager"
+            else:
+                class ProcessSerialNumber(Structure):
+                    _fields_ = [("highLongOfPSN", c_int),
+                                ("lowLongOfPSN", c_int)]
+                psn = ProcessSerialNumber()
+                psn_p = pointer(psn)
+                if (  (app_services.GetCurrentProcess(psn_p) < 0) or
+                      (app_services.SetFrontProcess(psn_p) < 0) ):
+                    _tk_unavailable = "cannot run without OS X gui process"
+        else:   # not OS X
+            import tkinter
+            try:
+                tkinter.Button()
+            except tkinter.TclError as msg:
+                # assuming tk is not available
+                _tk_unavailable = "tk not available: %s" % msg
+
+    if _tk_unavailable:
+        raise unittest.SkipTest(_tk_unavailable)
     return
 
 def get_tk_root():

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list