@@ -270,7 +270,7 @@ def __repr__(self):
270270 )
271271
272272
273- _support_default_root = 1
273+ _support_default_root = True
274274_default_root = None
275275
276276
@@ -280,13 +280,26 @@ def NoDefaultRoot():
280280 Call this function to inhibit that the first instance of
281281 Tk is used for windows without an explicit parent window.
282282 """
283- global _support_default_root
284- _support_default_root = 0
285- global _default_root
283+ global _support_default_root , _default_root
284+ _support_default_root = False
285+ # Delete, so any use of _default_root will immediately raise an exception.
286+ # Rebind before deletion, so repeated calls will not fail.
286287 _default_root = None
287288 del _default_root
288289
289290
291+ def _get_default_root (what = None ):
292+ if not _support_default_root :
293+ raise RuntimeError ("No master specified and tkinter is "
294+ "configured to not support default root" )
295+ if not _default_root :
296+ if what :
297+ raise RuntimeError (f"Too early to { what } : no default root window" )
298+ root = Tk ()
299+ assert _default_root is root
300+ return _default_root
301+
302+
290303def _tkerror (err ):
291304 """Internal function."""
292305 pass
@@ -330,7 +343,7 @@ def __init__(self, master=None, value=None, name=None):
330343 raise TypeError ("name must be a string" )
331344 global _varnum
332345 if not master :
333- master = _default_root
346+ master = _get_default_root ( 'create variable' )
334347 self ._root = master ._root ()
335348 self ._tk = master .tk
336349 if name :
@@ -589,7 +602,7 @@ def get(self):
589602
590603def mainloop (n = 0 ):
591604 """Run the main loop of Tcl."""
592- _default_root .tk .mainloop (n )
605+ _get_default_root ( 'run the main loop' ) .tk .mainloop (n )
593606
594607
595608getint = int
@@ -598,9 +611,9 @@ def mainloop(n=0):
598611
599612
600613def getboolean (s ):
601- """Convert true and false to integer values 1 and 0 ."""
614+ """Convert Tcl object to True or False ."""
602615 try :
603- return _default_root .tk .getboolean (s )
616+ return _get_default_root ( 'use getboolean()' ) .tk .getboolean (s )
604617 except TclError :
605618 raise ValueError ("invalid literal for getboolean()" )
606619
@@ -2246,7 +2259,7 @@ def __init__(self, screenName=None, baseName=None, className='Tk',
22462259 is the name of the widget class."""
22472260 self .master = None
22482261 self .children = {}
2249- self ._tkloaded = 0
2262+ self ._tkloaded = False
22502263 # to avoid recursions in the getattr code in case of failure, we
22512264 # ensure that self.tk is always _something_.
22522265 self .tk = None
@@ -2270,7 +2283,7 @@ def loadtk(self):
22702283 self ._loadtk ()
22712284
22722285 def _loadtk (self ):
2273- self ._tkloaded = 1
2286+ self ._tkloaded = True
22742287 global _default_root
22752288 # Version sanity checks
22762289 tk_version = self .tk .getvar ('tk_version' )
@@ -2519,12 +2532,8 @@ class BaseWidget(Misc):
25192532
25202533 def _setup (self , master , cnf ):
25212534 """Internal function. Sets up information about children."""
2522- if _support_default_root :
2523- global _default_root
2524- if not master :
2525- if not _default_root :
2526- _default_root = Tk ()
2527- master = _default_root
2535+ if not master :
2536+ master = _get_default_root ()
25282537 self .master = master
25292538 self .tk = master .tk
25302539 name = None
@@ -3988,9 +3997,7 @@ class Image:
39883997 def __init__ (self , imgtype , name = None , cnf = {}, master = None , ** kw ):
39893998 self .name = None
39903999 if not master :
3991- master = _default_root
3992- if not master :
3993- raise RuntimeError ('Too early to create image' )
4000+ master = _get_default_root ('create image' )
39944001 self .tk = getattr (master , 'tk' , master )
39954002 if not name :
39964003 Image ._last_id += 1
@@ -4144,11 +4151,13 @@ def __init__(self, name=None, cnf={}, master=None, **kw):
41444151
41454152
41464153def image_names ():
4147- return _default_root .tk .splitlist (_default_root .tk .call ('image' , 'names' ))
4154+ tk = _get_default_root ('use image_names()' ).tk
4155+ return tk .splitlist (tk .call ('image' , 'names' ))
41484156
41494157
41504158def image_types ():
4151- return _default_root .tk .splitlist (_default_root .tk .call ('image' , 'types' ))
4159+ tk = _get_default_root ('use image_types()' ).tk
4160+ return tk .splitlist (tk .call ('image' , 'types' ))
41524161
41534162
41544163class Spinbox (Widget , XView ):
0 commit comments