mirror of https://github.com/python/cpython
Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
test_tk or test_ttk_guionly under a username that is not currently logged in to the console windowserver (as may be the case under buildbot or ssh).
This commit is contained in:
parent
9ebe08d2f6
commit
4143535d86
|
@ -2,15 +2,11 @@ from test import support
|
|||
# Skip test if _tkinter wasn't built.
|
||||
support.import_module('_tkinter')
|
||||
|
||||
import tkinter
|
||||
from tkinter.test import runtktests
|
||||
import unittest
|
||||
# Skip test if tk cannot be initialized.
|
||||
from tkinter.test.support import check_tk_availability
|
||||
check_tk_availability()
|
||||
|
||||
try:
|
||||
tkinter.Button()
|
||||
except tkinter.TclError as msg:
|
||||
# assuming tk is not available
|
||||
raise unittest.SkipTest("tk not available: %s" % msg)
|
||||
from tkinter.test import runtktests
|
||||
|
||||
def test_main(enable_gui=False):
|
||||
if enable_gui:
|
||||
|
|
|
@ -5,6 +5,10 @@ from test import support
|
|||
# Skip this test if _tkinter wasn't built.
|
||||
support.import_module('_tkinter')
|
||||
|
||||
# Skip test if tk cannot be initialized.
|
||||
from tkinter.test.support import check_tk_availability
|
||||
check_tk_availability()
|
||||
|
||||
from _tkinter import TclError
|
||||
from tkinter import ttk
|
||||
from tkinter.test import runtktests
|
||||
|
|
|
@ -1,6 +1,42 @@
|
|||
import subprocess
|
||||
import sys
|
||||
from test import support
|
||||
import tkinter
|
||||
import unittest
|
||||
|
||||
_tk_available = None
|
||||
|
||||
def check_tk_availability():
|
||||
"""Check that Tk is installed and available."""
|
||||
global _tk_available
|
||||
|
||||
if _tk_available is not None:
|
||||
return
|
||||
|
||||
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)
|
||||
|
||||
_tk_available = True
|
||||
return
|
||||
|
||||
def get_tk_root():
|
||||
check_tk_availability() # raise exception if tk unavailable
|
||||
try:
|
||||
root = tkinter._default_root
|
||||
except AttributeError:
|
||||
|
|
|
@ -35,6 +35,14 @@ Library
|
|||
C-API
|
||||
-----
|
||||
|
||||
Tests
|
||||
-----
|
||||
|
||||
- Issue #8716: Avoid crashes caused by Aqua Tk on OSX when attempting to run
|
||||
test_tk or test_ttk_guionly under a username that is not currently logged
|
||||
in to the console windowserver (as may be the case under buildbot or ssh).
|
||||
|
||||
|
||||
What's New in Python 3.2.1 release candidate 2?
|
||||
===============================================
|
||||
|
||||
|
|
Loading…
Reference in New Issue