@@ -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 :
@@ -591,7 +604,7 @@ def get(self):
591604
592605def mainloop (n = 0 ):
593606 """Run the main loop of Tcl."""
594- _default_root .tk .mainloop (n )
607+ _get_default_root ( 'run the main loop' ) .tk .mainloop (n )
595608
596609
597610getint = int
@@ -600,9 +613,9 @@ def mainloop(n=0):
600613
601614
602615def getboolean (s ):
603- """Convert true and false to integer values 1 and 0 ."""
616+ """Convert Tcl object to True or False ."""
604617 try :
605- return _default_root .tk .getboolean (s )
618+ return _get_default_root ( 'use getboolean()' ) .tk .getboolean (s )
606619 except TclError :
607620 raise ValueError ("invalid literal for getboolean()" )
608621
@@ -2248,7 +2261,7 @@ def __init__(self, screenName=None, baseName=None, className='Tk',
22482261 is the name of the widget class."""
22492262 self .master = None
22502263 self .children = {}
2251- self ._tkloaded = 0
2264+ self ._tkloaded = False
22522265 # to avoid recursions in the getattr code in case of failure, we
22532266 # ensure that self.tk is always _something_.
22542267 self .tk = None
@@ -2272,7 +2285,7 @@ def loadtk(self):
22722285 self ._loadtk ()
22732286
22742287 def _loadtk (self ):
2275- self ._tkloaded = 1
2288+ self ._tkloaded = True
22762289 global _default_root
22772290 # Version sanity checks
22782291 tk_version = self .tk .getvar ('tk_version' )
@@ -2521,12 +2534,8 @@ class BaseWidget(Misc):
25212534
25222535 def _setup (self , master , cnf ):
25232536 """Internal function. Sets up information about children."""
2524- if _support_default_root :
2525- global _default_root
2526- if not master :
2527- if not _default_root :
2528- _default_root = Tk ()
2529- master = _default_root
2537+ if not master :
2538+ master = _get_default_root ()
25302539 self .master = master
25312540 self .tk = master .tk
25322541 name = None
@@ -3990,9 +3999,7 @@ class Image:
39903999 def __init__ (self , imgtype , name = None , cnf = {}, master = None , ** kw ):
39914000 self .name = None
39924001 if not master :
3993- master = _default_root
3994- if not master :
3995- raise RuntimeError ('Too early to create image' )
4002+ master = _get_default_root ('create image' )
39964003 self .tk = getattr (master , 'tk' , master )
39974004 if not name :
39984005 Image ._last_id += 1
@@ -4146,11 +4153,13 @@ def __init__(self, name=None, cnf={}, master=None, **kw):
41464153
41474154
41484155def image_names ():
4149- return _default_root .tk .splitlist (_default_root .tk .call ('image' , 'names' ))
4156+ tk = _get_default_root ('use image_names()' ).tk
4157+ return tk .splitlist (tk .call ('image' , 'names' ))
41504158
41514159
41524160def image_types ():
4153- return _default_root .tk .splitlist (_default_root .tk .call ('image' , 'types' ))
4161+ tk = _get_default_root ('use image_types()' ).tk
4162+ return tk .splitlist (tk .call ('image' , 'types' ))
41544163
41554164
41564165class Spinbox (Widget , XView ):
0 commit comments