gh-97527: IDLE: protect macosx Tk() call when no GUI (#97530)

Only call tkinter.tk and its follow-up code in _init_tk_type when requires('gui')
does not raise.  This function can be called as an unintended side-effect of
calling other idlelib code as part of tests on macOS without a GUI enabled.
This commit is contained in:
Terry Jan Reedy 2022-09-24 17:38:58 -04:00 committed by GitHub
parent db39050396
commit 9704f8da33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 13 deletions

View File

@ -4,6 +4,7 @@ A number of functions that enhance IDLE on macOS.
from os.path import expanduser from os.path import expanduser
import plistlib import plistlib
from sys import platform # Used in _init_tk_type, changed by test. from sys import platform # Used in _init_tk_type, changed by test.
from test.support import requires, ResourceDenied
import tkinter import tkinter
@ -14,23 +15,26 @@ import tkinter
_tk_type = None _tk_type = None
def _init_tk_type(): def _init_tk_type():
""" """ Initialize _tk_type for isXyzTk functions.
Initializes OS X Tk variant values for
isAquaTk(), isCarbonTk(), isCocoaTk(), and isXQuartz().
""" """
global _tk_type global _tk_type
if platform == 'darwin': if platform == 'darwin':
root = tkinter.Tk() try:
ws = root.tk.call('tk', 'windowingsystem') requires('gui')
if 'x11' in ws: except ResourceDenied: # Possible when testing.
_tk_type = "xquartz" _tk_type = "cocoa" # Newest and most common.
elif 'aqua' not in ws:
_tk_type = "other"
elif 'AppKit' in root.tk.call('winfo', 'server', '.'):
_tk_type = "cocoa"
else: else:
_tk_type = "carbon" root = tkinter.Tk()
root.destroy() ws = root.tk.call('tk', 'windowingsystem')
if 'x11' in ws:
_tk_type = "xquartz"
elif 'aqua' not in ws:
_tk_type = "other"
elif 'AppKit' in root.tk.call('winfo', 'server', '.'):
_tk_type = "cocoa"
else:
_tk_type = "carbon"
root.destroy()
else: else:
_tk_type = "other" _tk_type = "other"