[Python-checkins] cpython (2.7): Issue #22236: Tkinter tests now don't reuse default root window. New root

serhiy.storchaka python-checkins at python.org
Sun Aug 24 08:14:10 CEST 2014


http://hg.python.org/cpython/rev/32fdaf401e50
changeset:   92221:32fdaf401e50
branch:      2.7
parent:      92216:5a157e3b3c47
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sun Aug 24 09:07:09 2014 +0300
summary:
  Issue #22236: Tkinter tests now don't reuse default root window.  New root
window is created for every test class.

Fixed Tkinter images copying operations in NoDefaultRoot mode.

Tcl command names generated for "after" callbacks now contains a name of
original function.

files:
  Lib/lib-tk/Tkinter.py                                  |    9 +-
  Lib/lib-tk/test/test_tkinter/test_font.py              |   19 +-
  Lib/lib-tk/test/test_tkinter/test_geometry_managers.py |   10 +-
  Lib/lib-tk/test/test_tkinter/test_images.py            |   20 +-
  Lib/lib-tk/test/test_tkinter/test_text.py              |    9 +-
  Lib/lib-tk/test/test_tkinter/test_variables.py         |    6 +-
  Lib/lib-tk/test/test_tkinter/test_widgets.py           |   48 +-
  Lib/lib-tk/test/test_ttk/support.py                    |   50 ++-
  Lib/lib-tk/test/test_ttk/test_extensions.py            |  105 ++++---
  Lib/lib-tk/test/test_ttk/test_style.py                 |   10 +-
  Lib/lib-tk/test/test_ttk/test_widgets.py               |  140 +++------
  Lib/lib-tk/test/widget_tests.py                        |   41 +-
  Lib/test/test_ttk_guionly.py                           |   21 +-
  Misc/NEWS                                              |    5 +
  14 files changed, 229 insertions(+), 264 deletions(-)


diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -563,6 +563,7 @@
                         self.deletecommand(name)
                     except TclError:
                         pass
+            callit.__name__ = func.__name__
             name = self._register(callit)
             return self.tk.call('after', ms, name)
     def after_idle(self, func, *args):
@@ -3293,7 +3294,7 @@
             master = _default_root
             if not master:
                 raise RuntimeError, 'Too early to create image'
-        self.tk = master.tk
+        self.tk = getattr(master, 'tk', master)
         if not name:
             Image._last_id += 1
             name = "pyimage%r" % (Image._last_id,) # tk itself would use image<x>
@@ -3368,20 +3369,20 @@
     # XXX copy -from, -to, ...?
     def copy(self):
         """Return a new PhotoImage with the same image as this widget."""
-        destImage = PhotoImage()
+        destImage = PhotoImage(master=self.tk)
         self.tk.call(destImage, 'copy', self.name)
         return destImage
     def zoom(self,x,y=''):
         """Return a new PhotoImage with the same image as this widget
         but zoom it with X and Y."""
-        destImage = PhotoImage()
+        destImage = PhotoImage(master=self.tk)
         if y=='': y=x
         self.tk.call(destImage, 'copy', self.name, '-zoom',x,y)
         return destImage
     def subsample(self,x,y=''):
         """Return a new PhotoImage based on the same image as this widget
         but use only every Xth or Yth pixel."""
-        destImage = PhotoImage()
+        destImage = PhotoImage(master=self.tk)
         if y=='': y=x
         self.tk.call(destImage, 'copy', self.name, '-subsample',x,y)
         return destImage
diff --git a/Lib/lib-tk/test/test_tkinter/test_font.py b/Lib/lib-tk/test/test_tkinter/test_font.py
--- a/Lib/lib-tk/test/test_tkinter/test_font.py
+++ b/Lib/lib-tk/test/test_tkinter/test_font.py
@@ -1,28 +1,21 @@
 import unittest
 import Tkinter as tkinter
-#from Tkinter
 import tkFont as font
 from test.test_support import requires, run_unittest
-import test_ttk.support as support
+from test_ttk.support import AbstractTkTest
 
 requires('gui')
 
-class FontTest(unittest.TestCase):
-
-    def setUp(self):
-        support.root_deiconify()
-
-    def tearDown(self):
-        support.root_withdraw()
+class FontTest(AbstractTkTest, unittest.TestCase):
 
     def test_font_eq(self):
         fontname = "TkDefaultFont"
         try:
-            f = font.Font(name=fontname, exists=True)
+            f = font.Font(root=self.root, name=fontname, exists=True)
         except tkinter._tkinter.TclError:
-            f = font.Font(name=fontname, exists=False)
-        font1 = font.nametofont(fontname)
-        font2 = font.nametofont(fontname)
+            f = font.Font(root=self.root, name=fontname, exists=False)
+        font1 = font.Font(root=self.root, name=fontname, exists=True)
+        font2 = font.Font(root=self.root, name=fontname, exists=True)
         self.assertIsNot(font1, font2)
         self.assertEqual(font1, font2)
         self.assertNotEqual(font1, font1.copy())
diff --git a/Lib/lib-tk/test/test_tkinter/test_geometry_managers.py b/Lib/lib-tk/test/test_tkinter/test_geometry_managers.py
--- a/Lib/lib-tk/test/test_tkinter/test_geometry_managers.py
+++ b/Lib/lib-tk/test/test_tkinter/test_geometry_managers.py
@@ -278,7 +278,7 @@
 
     def create2(self):
         t = tkinter.Toplevel(self.root, width=300, height=200, bd=0)
-        t.wm_geometry('+0+0')
+        t.wm_geometry('300x200+0+0')
         f = tkinter.Frame(t, width=154, height=84, bd=2, relief='raised')
         f.place_configure(x=48, y=38)
         f2 = tkinter.Frame(t, width=30, height=60, bd=2, relief='raised')
@@ -479,17 +479,16 @@
 class GridTest(AbstractWidgetTest, unittest.TestCase):
 
     def tearDown(self):
-        super(GridTest, self).tearDown()
         cols, rows = self.root.grid_size()
         for i in range(cols + 1):
             self.root.grid_columnconfigure(i, weight=0, minsize=0, pad=0, uniform='')
         for i in range(rows + 1):
             self.root.grid_rowconfigure(i, weight=0, minsize=0, pad=0, uniform='')
         self.root.grid_propagate(1)
+        super(GridTest, self).tearDown()
 
     def test_grid_configure(self):
         b = tkinter.Button(self.root)
-        self.addCleanup(b.destroy)
         self.assertEqual(b.grid_info(), {})
         b.grid_configure()
         self.assertEqual(b.grid_info()['in'], self.root)
@@ -576,7 +575,6 @@
 
     def test_grid_configure_row(self):
         b = tkinter.Button(self.root)
-        self.addCleanup(b.destroy)
         with self.assertRaisesRegexp(TclError, 'bad (row|grid) value "-1": '
                                      'must be a non-negative integer'):
             b.grid_configure(row=-1)
@@ -782,7 +780,7 @@
             self.root.grid_bbox(0, 0, 0, 'x')
         with self.assertRaises(TypeError):
             self.root.grid_bbox(0, 0, 0, 0, 0)
-        t = tkinter.Toplevel(self.root)
+        t = self.root
         # de-maximize
         t.wm_geometry('1x1+0+0')
         t.wm_geometry('')
@@ -810,7 +808,7 @@
             self.root.grid_location('x', 'y')
         with self.assertRaisesRegexp(TclError, 'bad screen distance "y"'):
             self.root.grid_location('1c', 'y')
-        t = tkinter.Toplevel(self.root)
+        t = self.root
         # de-maximize
         t.wm_geometry('1x1+0+0')
         t.wm_geometry('')
diff --git a/Lib/lib-tk/test/test_tkinter/test_images.py b/Lib/lib-tk/test/test_tkinter/test_images.py
--- a/Lib/lib-tk/test/test_tkinter/test_images.py
+++ b/Lib/lib-tk/test/test_tkinter/test_images.py
@@ -2,15 +2,12 @@
 import Tkinter as tkinter
 import ttk
 import test.test_support as support
-from test_ttk.support import requires_tcl
+from test_ttk.support import AbstractTkTest, requires_tcl
 
 support.requires('gui')
 
 
-class MiscTest(unittest.TestCase):
-
-    def setUp(self):
-        self.root = ttk.setup_master()
+class MiscTest(AbstractTkTest, unittest.TestCase):
 
     def test_image_types(self):
         image_types = self.root.image_types()
@@ -23,15 +20,13 @@
         self.assertIsInstance(image_names, tuple)
 
 
-class BitmapImageTest(unittest.TestCase):
+class BitmapImageTest(AbstractTkTest, unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
+        AbstractTkTest.setUpClass.__func__(cls)
         cls.testfile = support.findfile('python.xbm', subdir='imghdrdata')
 
-    def setUp(self):
-        self.root = ttk.setup_master()
-
     def test_create_from_file(self):
         image = tkinter.BitmapImage('::img::test', master=self.root,
                                     foreground='yellow', background='blue',
@@ -107,16 +102,13 @@
                          '-foreground {} {} #000000 yellow')
 
 
-class PhotoImageTest(unittest.TestCase):
+class PhotoImageTest(AbstractTkTest, unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
+        AbstractTkTest.setUpClass.__func__(cls)
         cls.testfile = support.findfile('python.gif', subdir='imghdrdata')
 
-    def setUp(self):
-        self.root = ttk.setup_master()
-        self.wantobjects = self.root.wantobjects()
-
     def create(self):
         return tkinter.PhotoImage('::img::test', master=self.root,
                                   file=self.testfile)
diff --git a/Lib/lib-tk/test/test_tkinter/test_text.py b/Lib/lib-tk/test/test_tkinter/test_text.py
--- a/Lib/lib-tk/test/test_tkinter/test_text.py
+++ b/Lib/lib-tk/test/test_tkinter/test_text.py
@@ -1,19 +1,16 @@
 import unittest
 import Tkinter as tkinter
 from test.test_support import requires, run_unittest
-from ttk import setup_master
+from test_ttk.support import AbstractTkTest
 
 requires('gui')
 
-class TextTest(unittest.TestCase):
+class TextTest(AbstractTkTest, unittest.TestCase):
 
     def setUp(self):
-        self.root = setup_master()
+        super(TextTest, self).setUp()
         self.text = tkinter.Text(self.root)
 
-    def tearDown(self):
-        self.text.destroy()
-
     def test_debug(self):
         text = self.text
         olddebug = text.debug()
diff --git a/Lib/lib-tk/test/test_tkinter/test_variables.py b/Lib/lib-tk/test/test_tkinter/test_variables.py
--- a/Lib/lib-tk/test/test_tkinter/test_variables.py
+++ b/Lib/lib-tk/test/test_tkinter/test_variables.py
@@ -1,15 +1,15 @@
 import unittest
 
-from Tkinter import Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tk, TclError
+from Tkinter import Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl, TclError
 
 
 class TestBase(unittest.TestCase):
 
     def setUp(self):
-        self.root = Tk()
+        self.root = Tcl()
 
     def tearDown(self):
-        self.root.destroy()
+        del self.root
 
 
 class TestVariable(TestBase):
diff --git a/Lib/lib-tk/test/test_tkinter/test_widgets.py b/Lib/lib-tk/test/test_tkinter/test_widgets.py
--- a/Lib/lib-tk/test/test_tkinter/test_widgets.py
+++ b/Lib/lib-tk/test/test_tkinter/test_widgets.py
@@ -63,7 +63,7 @@
         'takefocus', 'use', 'visual', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Toplevel(self.root, **kwargs)
 
     def test_menu(self):
@@ -102,7 +102,7 @@
         'relief', 'takefocus', 'visual', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Frame(self.root, **kwargs)
 
 
@@ -117,7 +117,7 @@
         'takefocus', 'text', 'visual', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.LabelFrame(self.root, **kwargs)
 
     def test_labelanchor(self):
@@ -155,7 +155,7 @@
         'underline', 'width', 'wraplength',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Label(self.root, **kwargs)
 
 
@@ -172,7 +172,7 @@
         'state', 'takefocus', 'text', 'textvariable',
         'underline', 'width', 'wraplength')
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Button(self.root, **kwargs)
 
     def test_default(self):
@@ -196,7 +196,7 @@
         'underline', 'variable', 'width', 'wraplength',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Checkbutton(self.root, **kwargs)
 
 
@@ -224,7 +224,7 @@
         'underline', 'value', 'variable', 'width', 'wraplength',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Radiobutton(self.root, **kwargs)
 
     def test_value(self):
@@ -247,7 +247,7 @@
     )
     _conv_pixels = staticmethod(pixels_round)
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Menubutton(self.root, **kwargs)
 
     def test_direction(self):
@@ -265,7 +265,7 @@
                      'crashes with Cocoa Tk (issue19733)')
     def test_image(self):
         widget = self.create()
-        image = tkinter.PhotoImage('image1')
+        image = tkinter.PhotoImage(master=self.root, name='image1')
         self.checkParam(widget, 'image', image, conv=str)
         errmsg = 'image "spam" doesn\'t exist'
         with self.assertRaises(tkinter.TclError) as cm:
@@ -300,7 +300,7 @@
 
 class OptionMenuTest(MenubuttonTest, unittest.TestCase):
 
-    def _create(self, default='b', values=('a', 'b', 'c'), **kwargs):
+    def create(self, default='b', values=('a', 'b', 'c'), **kwargs):
         return tkinter.OptionMenu(self.root, None, default, *values, **kwargs)
 
 
@@ -319,7 +319,7 @@
         'validate', 'validatecommand', 'width', 'xscrollcommand',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Entry(self.root, **kwargs)
 
     def test_disabledbackground(self):
@@ -393,7 +393,7 @@
         'width', 'wrap', 'xscrollcommand',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Spinbox(self.root, **kwargs)
 
     test_show = None
@@ -487,9 +487,9 @@
         'xscrollcommand', 'yscrollcommand',
     )
     if tcl_version < (8, 5):
-        wantobjects = False
+        _stringify = True
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Text(self.root, **kwargs)
 
     def test_autoseparators(self):
@@ -641,9 +641,9 @@
     )
 
     _conv_pixels = staticmethod(int_round)
-    wantobjects = False
+    _stringify = True
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Canvas(self.root, **kwargs)
 
     def test_closeenough(self):
@@ -696,7 +696,7 @@
         'takefocus', 'width', 'xscrollcommand', 'yscrollcommand',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Listbox(self.root, **kwargs)
 
     def test_activestyle(self):
@@ -706,7 +706,7 @@
 
     def test_listvariable(self):
         widget = self.create()
-        var = tkinter.DoubleVar()
+        var = tkinter.DoubleVar(self.root)
         self.checkVariableParam(widget, 'listvariable', var)
 
     def test_selectmode(self):
@@ -828,7 +828,7 @@
     )
     default_orient = 'vertical'
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Scale(self.root, **kwargs)
 
     def test_bigincrement(self):
@@ -894,10 +894,10 @@
         'takefocus', 'troughcolor', 'width',
     )
     _conv_pixels = staticmethod(int_round)
-    wantobjects = False
+    _stringify = True
     default_orient = 'vertical'
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Scrollbar(self.root, **kwargs)
 
     def test_activerelief(self):
@@ -943,7 +943,7 @@
     )
     default_orient = 'horizontal'
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.PanedWindow(self.root, **kwargs)
 
     def test_handlepad(self):
@@ -1101,7 +1101,7 @@
     )
     _conv_pixels = noconv_meth
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Menu(self.root, **kwargs)
 
     def test_postcommand(self):
@@ -1170,7 +1170,7 @@
     )
     _conv_pad_pixels = noconv_meth
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Message(self.root, **kwargs)
 
     def test_aspect(self):
diff --git a/Lib/lib-tk/test/test_ttk/support.py b/Lib/lib-tk/test/test_ttk/support.py
--- a/Lib/lib-tk/test/test_ttk/support.py
+++ b/Lib/lib-tk/test/test_ttk/support.py
@@ -1,29 +1,43 @@
 import unittest
 import Tkinter as tkinter
 
-def get_tk_root():
-    try:
-        root = tkinter._default_root
-    except AttributeError:
-        # it is possible to disable default root in Tkinter, although
-        # I haven't seen people doing it (but apparently someone did it
-        # here).
-        root = None
+class AbstractTkTest:
 
-    if root is None:
-        # create a new master only if there isn't one already
-        root = tkinter.Tk()
+    @classmethod
+    def setUpClass(cls):
+        cls._old_support_default_root = tkinter._support_default_root
+        destroy_default_root()
+        tkinter.NoDefaultRoot()
+        cls.root = tkinter.Tk()
+        cls.wantobjects = cls.root.wantobjects()
+        # De-maximize main window.
+        # Some window managers can maximize new windows.
+        cls.root.wm_state('normal')
+        try:
+            cls.root.wm_attributes('-zoomed', False)
+        except tkinter.TclError:
+            pass
 
-    return root
+    @classmethod
+    def tearDownClass(cls):
+        cls.root.destroy()
+        cls.root = None
+        tkinter._default_root = None
+        tkinter._support_default_root = cls._old_support_default_root
 
-def root_deiconify():
-    root = get_tk_root()
-    root.deiconify()
+    def setUp(self):
+        self.root.deiconify()
 
-def root_withdraw():
-    root = get_tk_root()
-    root.withdraw()
+    def tearDown(self):
+        for w in self.root.winfo_children():
+            w.destroy()
+        self.root.withdraw()
 
+def destroy_default_root():
+    if getattr(tkinter, '_default_root', None):
+        tkinter._default_root.update_idletasks()
+        tkinter._default_root.destroy()
+        tkinter._default_root = None
 
 def simulate_mouse_click(widget, x, y):
     """Generate proper events to click at the x, y position (tries to act
diff --git a/Lib/lib-tk/test/test_ttk/test_extensions.py b/Lib/lib-tk/test/test_ttk/test_extensions.py
--- a/Lib/lib-tk/test/test_ttk/test_extensions.py
+++ b/Lib/lib-tk/test/test_ttk/test_extensions.py
@@ -2,34 +2,30 @@
 import unittest
 import Tkinter as tkinter
 import ttk
-from test.test_support import requires, run_unittest
-
-import support
+from test.test_support import requires, run_unittest, swap_attr
+from test_ttk.support import AbstractTkTest, destroy_default_root
 
 requires('gui')
 
-class LabeledScaleTest(unittest.TestCase):
-
-    def setUp(self):
-        support.root_deiconify()
+class LabeledScaleTest(AbstractTkTest, unittest.TestCase):
 
     def tearDown(self):
-        support.root_withdraw()
-
+        self.root.update_idletasks()
+        super(LabeledScaleTest, self).tearDown()
 
     def test_widget_destroy(self):
         # automatically created variable
-        x = ttk.LabeledScale()
+        x = ttk.LabeledScale(self.root)
         var = x._variable._name
         x.destroy()
         self.assertRaises(tkinter.TclError, x.tk.globalgetvar, var)
 
         # manually created variable
-        myvar = tkinter.DoubleVar()
+        myvar = tkinter.DoubleVar(self.root)
         name = myvar._name
-        x = ttk.LabeledScale(variable=myvar)
+        x = ttk.LabeledScale(self.root, variable=myvar)
         x.destroy()
-        if x.tk.wantobjects():
+        if self.wantobjects:
             self.assertEqual(x.tk.globalgetvar(name), myvar.get())
         else:
             self.assertEqual(float(x.tk.globalgetvar(name)), myvar.get())
@@ -37,26 +33,36 @@
         self.assertRaises(tkinter.TclError, x.tk.globalgetvar, name)
 
         # checking that the tracing callback is properly removed
-        myvar = tkinter.IntVar()
+        myvar = tkinter.IntVar(self.root)
         # LabeledScale will start tracing myvar
-        x = ttk.LabeledScale(variable=myvar)
+        x = ttk.LabeledScale(self.root, variable=myvar)
         x.destroy()
         # Unless the tracing callback was removed, creating a new
         # LabeledScale with the same var will cause an error now. This
         # happens because the variable will be set to (possibly) a new
         # value which causes the tracing callback to be called and then
         # it tries calling instance attributes not yet defined.
-        ttk.LabeledScale(variable=myvar)
+        ttk.LabeledScale(self.root, variable=myvar)
         if hasattr(sys, 'last_type'):
             self.assertNotEqual(sys.last_type, tkinter.TclError)
 
 
+    def test_initialization_no_master(self):
+        # no master passing
+        with swap_attr(tkinter, '_default_root', None), \
+             swap_attr(tkinter, '_support_default_root', True):
+            try:
+                x = ttk.LabeledScale()
+                self.assertIsNotNone(tkinter._default_root)
+                self.assertEqual(x.master, tkinter._default_root)
+                self.assertEqual(x.tk, tkinter._default_root.tk)
+                x.destroy()
+            finally:
+                destroy_default_root()
+
     def test_initialization(self):
         # master passing
-        x = ttk.LabeledScale()
-        self.assertEqual(x.master, tkinter._default_root)
-        x.destroy()
-        master = tkinter.Frame()
+        master = tkinter.Frame(self.root)
         x = ttk.LabeledScale(master)
         self.assertEqual(x.master, master)
         x.destroy()
@@ -64,25 +70,25 @@
         # variable initialization/passing
         passed_expected = (('0', 0), (0, 0), (10, 10),
             (-1, -1), (sys.maxint + 1, sys.maxint + 1))
-        if x.tk.wantobjects():
+        if self.wantobjects:
             passed_expected += ((2.5, 2),)
         for pair in passed_expected:
-            x = ttk.LabeledScale(from_=pair[0])
+            x = ttk.LabeledScale(self.root, from_=pair[0])
             self.assertEqual(x.value, pair[1])
             x.destroy()
-        x = ttk.LabeledScale(from_='2.5')
+        x = ttk.LabeledScale(self.root, from_='2.5')
         self.assertRaises(ValueError, x._variable.get)
         x.destroy()
-        x = ttk.LabeledScale(from_=None)
+        x = ttk.LabeledScale(self.root, from_=None)
         self.assertRaises(ValueError, x._variable.get)
         x.destroy()
         # variable should have its default value set to the from_ value
-        myvar = tkinter.DoubleVar(value=20)
-        x = ttk.LabeledScale(variable=myvar)
+        myvar = tkinter.DoubleVar(self.root, value=20)
+        x = ttk.LabeledScale(self.root, variable=myvar)
         self.assertEqual(x.value, 0)
         x.destroy()
         # check that it is really using a DoubleVar
-        x = ttk.LabeledScale(variable=myvar, from_=0.5)
+        x = ttk.LabeledScale(self.root, variable=myvar, from_=0.5)
         self.assertEqual(x.value, 0.5)
         self.assertEqual(x._variable._name, myvar._name)
         x.destroy()
@@ -91,25 +97,26 @@
         def check_positions(scale, scale_pos, label, label_pos):
             self.assertEqual(scale.pack_info()['side'], scale_pos)
             self.assertEqual(label.place_info()['anchor'], label_pos)
-        x = ttk.LabeledScale(compound='top')
+        x = ttk.LabeledScale(self.root, compound='top')
         check_positions(x.scale, 'bottom', x.label, 'n')
         x.destroy()
-        x = ttk.LabeledScale(compound='bottom')
+        x = ttk.LabeledScale(self.root, compound='bottom')
         check_positions(x.scale, 'top', x.label, 's')
         x.destroy()
-        x = ttk.LabeledScale(compound='unknown') # invert default positions
+        # invert default positions
+        x = ttk.LabeledScale(self.root, compound='unknown')
         check_positions(x.scale, 'top', x.label, 's')
         x.destroy()
-        x = ttk.LabeledScale() # take default positions
+        x = ttk.LabeledScale(self.root) # take default positions
         check_positions(x.scale, 'bottom', x.label, 'n')
         x.destroy()
 
         # extra, and invalid, kwargs
-        self.assertRaises(tkinter.TclError, ttk.LabeledScale, a='b')
+        self.assertRaises(tkinter.TclError, ttk.LabeledScale, master, a='b')
 
 
     def test_horizontal_range(self):
-        lscale = ttk.LabeledScale(from_=0, to=10)
+        lscale = ttk.LabeledScale(self.root, from_=0, to=10)
         lscale.pack()
         lscale.wait_visibility()
         lscale.update()
@@ -128,7 +135,7 @@
         self.assertNotEqual(prev_xcoord, curr_xcoord)
         # the label widget should have been repositioned too
         linfo_2 = lscale.label.place_info()
-        self.assertEqual(lscale.label['text'], 0 if lscale.tk.wantobjects() else '0')
+        self.assertEqual(lscale.label['text'], 0 if self.wantobjects else '0')
         self.assertEqual(curr_xcoord, int(linfo_2['x']))
         # change the range back
         lscale.scale.configure(from_=0, to=10)
@@ -139,7 +146,7 @@
 
 
     def test_variable_change(self):
-        x = ttk.LabeledScale()
+        x = ttk.LabeledScale(self.root)
         x.pack()
         x.wait_visibility()
         x.update()
@@ -151,13 +158,13 @@
         # at the same time this shouldn't affect test outcome
         x.update()
         self.assertEqual(x.label['text'],
-                         newval if x.tk.wantobjects() else str(newval))
+                         newval if self.wantobjects else str(newval))
         self.assertGreater(x.scale.coords()[0], curr_xcoord)
         self.assertEqual(x.scale.coords()[0],
             int(x.label.place_info()['x']))
 
         # value outside range
-        if x.tk.wantobjects():
+        if self.wantobjects:
             conv = lambda x: x
         else:
             conv = int
@@ -171,7 +178,7 @@
 
 
     def test_resize(self):
-        x = ttk.LabeledScale()
+        x = ttk.LabeledScale(self.root)
         x.pack(expand=True, fill='both')
         x.wait_visibility()
         x.update()
@@ -190,20 +197,20 @@
         x.destroy()
 
 
-class OptionMenuTest(unittest.TestCase):
+class OptionMenuTest(AbstractTkTest, unittest.TestCase):
 
     def setUp(self):
-        support.root_deiconify()
-        self.textvar = tkinter.StringVar()
+        super(OptionMenuTest, self).setUp()
+        self.textvar = tkinter.StringVar(self.root)
 
     def tearDown(self):
         del self.textvar
-        support.root_withdraw()
+        super(OptionMenuTest, self).tearDown()
 
 
     def test_widget_destroy(self):
-        var = tkinter.StringVar()
-        optmenu = ttk.OptionMenu(None, var)
+        var = tkinter.StringVar(self.root)
+        optmenu = ttk.OptionMenu(self.root, var)
         name = var._name
         optmenu.update_idletasks()
         optmenu.destroy()
@@ -214,9 +221,9 @@
 
     def test_initialization(self):
         self.assertRaises(tkinter.TclError,
-            ttk.OptionMenu, None, self.textvar, invalid='thing')
+            ttk.OptionMenu, self.root, self.textvar, invalid='thing')
 
-        optmenu = ttk.OptionMenu(None, self.textvar, 'b', 'a', 'b')
+        optmenu = ttk.OptionMenu(self.root, self.textvar, 'b', 'a', 'b')
         self.assertEqual(optmenu._variable.get(), 'b')
 
         self.assertTrue(optmenu['menu'])
@@ -228,7 +235,7 @@
     def test_menu(self):
         items = ('a', 'b', 'c')
         default = 'a'
-        optmenu = ttk.OptionMenu(None, self.textvar, default, *items)
+        optmenu = ttk.OptionMenu(self.root, self.textvar, default, *items)
         found_default = False
         for i in range(len(items)):
             value = optmenu['menu'].entrycget(i, 'value')
@@ -240,7 +247,7 @@
 
         # default shouldn't be in menu if it is not part of values
         default = 'd'
-        optmenu = ttk.OptionMenu(None, self.textvar, default, *items)
+        optmenu = ttk.OptionMenu(self.root, self.textvar, default, *items)
         curr = None
         i = 0
         while True:
@@ -269,7 +276,7 @@
         def cb_test(item):
             self.assertEqual(item, items[1])
             success.append(True)
-        optmenu = ttk.OptionMenu(None, self.textvar, 'a', command=cb_test,
+        optmenu = ttk.OptionMenu(self.root, self.textvar, 'a', command=cb_test,
             *items)
         optmenu['menu'].invoke(1)
         if not success:
diff --git a/Lib/lib-tk/test/test_ttk/test_style.py b/Lib/lib-tk/test/test_ttk/test_style.py
--- a/Lib/lib-tk/test/test_ttk/test_style.py
+++ b/Lib/lib-tk/test/test_ttk/test_style.py
@@ -2,15 +2,15 @@
 import Tkinter as tkinter
 import ttk
 from test.test_support import requires, run_unittest
-
-import support
+from test_ttk.support import AbstractTkTest
 
 requires('gui')
 
-class StyleTest(unittest.TestCase):
+class StyleTest(AbstractTkTest, unittest.TestCase):
 
     def setUp(self):
-        self.style = ttk.Style()
+        super(StyleTest, self).setUp()
+        self.style = ttk.Style(self.root)
 
 
     def test_configure(self):
@@ -25,7 +25,7 @@
         style = self.style
         style.map('TButton', background=[('active', 'background', 'blue')])
         self.assertEqual(style.map('TButton', 'background'),
-            [('active', 'background', 'blue')] if style.tk.wantobjects() else
+            [('active', 'background', 'blue')] if self.wantobjects else
             [('active background', 'blue')])
         self.assertIsInstance(style.map('TButton'), dict)
 
diff --git a/Lib/lib-tk/test/test_ttk/test_widgets.py b/Lib/lib-tk/test/test_ttk/test_widgets.py
--- a/Lib/lib-tk/test/test_ttk/test_widgets.py
+++ b/Lib/lib-tk/test/test_ttk/test_widgets.py
@@ -4,9 +4,9 @@
 from test.test_support import requires, run_unittest
 import sys
 
-import support
-from test_functions import MockTclObj, MockStateSpec
-from support import tcl_version, get_tk_patchlevel
+from test_functions import MockTclObj
+from support import (AbstractTkTest, tcl_version, get_tk_patchlevel,
+                     simulate_mouse_click)
 from widget_tests import (add_standard_options, noconv, noconv_meth,
     AbstractWidgetTest, StandardOptionsTests,
     IntegerSizeTests, PixelSizeTests,
@@ -54,19 +54,15 @@
         pass
 
 
-class WidgetTest(unittest.TestCase):
+class WidgetTest(AbstractTkTest, unittest.TestCase):
     """Tests methods available in every ttk widget."""
 
     def setUp(self):
-        support.root_deiconify()
-        self.widget = ttk.Button(width=0, text="Text")
+        super(WidgetTest, self).setUp()
+        self.widget = ttk.Button(self.root, width=0, text="Text")
         self.widget.pack()
         self.widget.wait_visibility()
 
-    def tearDown(self):
-        self.widget.destroy()
-        support.root_withdraw()
-
 
     def test_identify(self):
         self.widget.update_idletasks()
@@ -129,7 +125,7 @@
         'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Frame(self.root, **kwargs)
 
 
@@ -142,7 +138,7 @@
         'text', 'underline', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.LabelFrame(self.root, **kwargs)
 
     def test_labelanchor(self):
@@ -162,8 +158,8 @@
 class AbstractLabelTest(AbstractWidgetTest):
 
     def checkImageParam(self, widget, name):
-        image = tkinter.PhotoImage('image1')
-        image2 = tkinter.PhotoImage('image2')
+        image = tkinter.PhotoImage(master=self.root, name='image1')
+        image2 = tkinter.PhotoImage(master=self.root, name='image2')
         self.checkParam(widget, name, image, expected=('image1',))
         self.checkParam(widget, name, 'image1', expected=('image1',))
         self.checkParam(widget, name, (image,), expected=('image1',))
@@ -200,7 +196,7 @@
     )
     _conv_pixels = noconv_meth
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Label(self.root, **kwargs)
 
     def test_font(self):
@@ -217,7 +213,7 @@
         'underline', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Button(self.root, **kwargs)
 
     def test_default(self):
@@ -226,7 +222,7 @@
 
     def test_invoke(self):
         success = []
-        btn = ttk.Button(command=lambda: success.append(1))
+        btn = ttk.Button(self.root, command=lambda: success.append(1))
         btn.invoke()
         self.assertTrue(success)
 
@@ -242,7 +238,7 @@
         'underline', 'variable', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Checkbutton(self.root, **kwargs)
 
     def test_offvalue(self):
@@ -259,7 +255,7 @@
             success.append(1)
             return "cb test called"
 
-        cbtn = ttk.Checkbutton(command=cb_test)
+        cbtn = ttk.Checkbutton(self.root, command=cb_test)
         # the variable automatically created by ttk.Checkbutton is actually
         # undefined till we invoke the Checkbutton
         self.assertEqual(cbtn.state(), ('alternate', ))
@@ -290,15 +286,9 @@
 
     def setUp(self):
         super(ComboboxTest, self).setUp()
-        support.root_deiconify()
         self.combo = self.create()
 
-    def tearDown(self):
-        self.combo.destroy()
-        support.root_withdraw()
-        super(ComboboxTest, self).tearDown()
-
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Combobox(self.root, **kwargs)
 
     def test_height(self):
@@ -406,7 +396,7 @@
         self.assertRaises(tkinter.TclError, self.combo.current, '')
 
         # testing creating combobox with empty string in values
-        combo2 = ttk.Combobox(values=[1, 2, ''])
+        combo2 = ttk.Combobox(self.root, values=[1, 2, ''])
         self.assertEqual(combo2['values'],
                          ('1', '2', '') if self.wantobjects else '1 2 {}')
         combo2.destroy()
@@ -424,15 +414,9 @@
 
     def setUp(self):
         super(EntryTest, self).setUp()
-        support.root_deiconify()
         self.entry = self.create()
 
-    def tearDown(self):
-        self.entry.destroy()
-        support.root_withdraw()
-        super(EntryTest, self).tearDown()
-
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Entry(self.root, **kwargs)
 
     def test_invalidcommand(self):
@@ -559,15 +543,9 @@
 
     def setUp(self):
         super(PanedWindowTest, self).setUp()
-        support.root_deiconify()
         self.paned = self.create()
 
-    def tearDown(self):
-        self.paned.destroy()
-        support.root_withdraw()
-        super(PanedWindowTest, self).tearDown()
-
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.PanedWindow(self.root, **kwargs)
 
     def test_orient(self):
@@ -589,13 +567,13 @@
         label.destroy()
         child.destroy()
         # another attempt
-        label = ttk.Label()
+        label = ttk.Label(self.root)
         child = ttk.Label(label)
         self.assertRaises(tkinter.TclError, self.paned.add, child)
         child.destroy()
         label.destroy()
 
-        good_child = ttk.Label()
+        good_child = ttk.Label(self.root)
         self.paned.add(good_child)
         # re-adding a child is not accepted
         self.assertRaises(tkinter.TclError, self.paned.add, good_child)
@@ -613,7 +591,7 @@
         self.assertRaises(tkinter.TclError, self.paned.forget, None)
         self.assertRaises(tkinter.TclError, self.paned.forget, 0)
 
-        self.paned.add(ttk.Label())
+        self.paned.add(ttk.Label(self.root))
         self.paned.forget(0)
         self.assertRaises(tkinter.TclError, self.paned.forget, 0)
 
@@ -623,9 +601,9 @@
         self.assertRaises(tkinter.TclError, self.paned.insert, 0, None)
         self.assertRaises(tkinter.TclError, self.paned.insert, 0, 0)
 
-        child = ttk.Label()
-        child2 = ttk.Label()
-        child3 = ttk.Label()
+        child = ttk.Label(self.root)
+        child2 = ttk.Label(self.root)
+        child3 = ttk.Label(self.root)
 
         self.assertRaises(tkinter.TclError, self.paned.insert, 0, child)
 
@@ -656,7 +634,7 @@
     def test_pane(self):
         self.assertRaises(tkinter.TclError, self.paned.pane, 0)
 
-        child = ttk.Label()
+        child = ttk.Label(self.root)
         self.paned.add(child)
         self.assertIsInstance(self.paned.pane(0), dict)
         self.assertEqual(self.paned.pane(0, weight=None),
@@ -701,7 +679,7 @@
         'underline', 'value', 'variable', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Radiobutton(self.root, **kwargs)
 
     def test_value(self):
@@ -714,9 +692,11 @@
             success.append(1)
             return "cb test called"
 
-        myvar = tkinter.IntVar()
-        cbtn = ttk.Radiobutton(command=cb_test, variable=myvar, value=0)
-        cbtn2 = ttk.Radiobutton(command=cb_test, variable=myvar, value=1)
+        myvar = tkinter.IntVar(self.root)
+        cbtn = ttk.Radiobutton(self.root, command=cb_test,
+                               variable=myvar, value=0)
+        cbtn2 = ttk.Radiobutton(self.root, command=cb_test,
+                                variable=myvar, value=1)
 
         if self.wantobjects:
             conv = lambda x: x
@@ -749,7 +729,7 @@
         'underline', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Menubutton(self.root, **kwargs)
 
     def test_direction(self):
@@ -775,17 +755,11 @@
 
     def setUp(self):
         super(ScaleTest, self).setUp()
-        support.root_deiconify()
         self.scale = self.create()
         self.scale.pack()
         self.scale.update()
 
-    def tearDown(self):
-        self.scale.destroy()
-        support.root_withdraw()
-        super(ScaleTest, self).tearDown()
-
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Scale(self.root, **kwargs)
 
     def test_from(self):
@@ -857,7 +831,7 @@
         self.assertEqual(conv(self.scale.get()), min)
 
         # changing directly the variable doesn't impose this limitation tho
-        var = tkinter.DoubleVar()
+        var = tkinter.DoubleVar(self.root)
         self.scale['variable'] = var
         var.set(max + 5)
         self.assertEqual(conv(self.scale.get()), var.get())
@@ -887,7 +861,7 @@
     _conv_pixels = noconv_meth
     default_orient = 'horizontal'
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Progressbar(self.root, **kwargs)
 
     def test_length(self):
@@ -921,7 +895,7 @@
     )
     default_orient = 'vertical'
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Scrollbar(self.root, **kwargs)
 
 
@@ -933,21 +907,13 @@
 
     def setUp(self):
         super(NotebookTest, self).setUp()
-        support.root_deiconify()
         self.nb = self.create(padding=0)
-        self.child1 = ttk.Label()
-        self.child2 = ttk.Label()
+        self.child1 = ttk.Label(self.root)
+        self.child2 = ttk.Label(self.root)
         self.nb.add(self.child1, text='a')
         self.nb.add(self.child2, text='b')
 
-    def tearDown(self):
-        self.child1.destroy()
-        self.child2.destroy()
-        self.nb.destroy()
-        support.root_withdraw()
-        super(NotebookTest, self).tearDown()
-
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Notebook(self.root, **kwargs)
 
     def test_tab_identifiers(self):
@@ -986,7 +952,7 @@
         self.assertRaises(tkinter.TclError, self.nb.hide, 'hi')
         self.assertRaises(tkinter.TclError, self.nb.hide, None)
         self.assertRaises(tkinter.TclError, self.nb.add, None)
-        self.assertRaises(tkinter.TclError, self.nb.add, ttk.Label(),
+        self.assertRaises(tkinter.TclError, self.nb.add, ttk.Label(self.root),
             unknown='option')
 
         tabs = self.nb.tabs()
@@ -994,7 +960,7 @@
         self.nb.add(self.child1)
         self.assertEqual(self.nb.tabs(), tabs)
 
-        child = ttk.Label()
+        child = ttk.Label(self.root)
         self.nb.add(child, text='c')
         tabs = self.nb.tabs()
 
@@ -1052,7 +1018,7 @@
         self.assertRaises(tkinter.TclError, self.nb.insert, -1, tabs[0])
 
         # new tab
-        child3 = ttk.Label()
+        child3 = ttk.Label(self.root)
         self.nb.insert(1, child3)
         self.assertEqual(self.nb.tabs(), (tabs[0], str(child3), tabs[1]))
         self.nb.forget(child3)
@@ -1118,7 +1084,7 @@
 
         self.nb.select(0)
 
-        support.simulate_mouse_click(self.nb, 5, 5)
+        simulate_mouse_click(self.nb, 5, 5)
         self.nb.focus_force()
         self.nb.event_generate('<Control-Tab>')
         self.assertEqual(self.nb.select(), str(self.child2))
@@ -1132,7 +1098,7 @@
         self.nb.tab(self.child1, text='a', underline=0)
         self.nb.enable_traversal()
         self.nb.focus_force()
-        support.simulate_mouse_click(self.nb, 5, 5)
+        simulate_mouse_click(self.nb, 5, 5)
         if sys.platform == 'darwin':
             self.nb.event_generate('<Option-a>')
         else:
@@ -1150,15 +1116,9 @@
 
     def setUp(self):
         super(TreeviewTest, self).setUp()
-        support.root_deiconify()
         self.tv = self.create(padding=0)
 
-    def tearDown(self):
-        self.tv.destroy()
-        support.root_withdraw()
-        super(TreeviewTest, self).tearDown()
-
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Treeview(self.root, **kwargs)
 
     def test_columns(self):
@@ -1394,7 +1354,7 @@
 
     def test_heading_callback(self):
         def simulate_heading_click(x, y):
-            support.simulate_mouse_click(self.tv, x, y)
+            simulate_mouse_click(self.tv, x, y)
             self.tv.update()
 
         success = [] # no success for now
@@ -1583,7 +1543,7 @@
 
         self.assertEqual(len(pos_y), 2) # item1 and item2 y pos
         for y in pos_y:
-            support.simulate_mouse_click(self.tv, 0, y)
+            simulate_mouse_click(self.tv, 0, y)
 
         # by now there should be 4 things in the events list, since each
         # item had a bind for two events that were simulated above
@@ -1613,7 +1573,7 @@
     )
     default_orient = 'horizontal'
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Separator(self.root, **kwargs)
 
 
@@ -1624,7 +1584,7 @@
         # 'state'?
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Sizegrip(self.root, **kwargs)
 
 
diff --git a/Lib/lib-tk/test/widget_tests.py b/Lib/lib-tk/test/widget_tests.py
--- a/Lib/lib-tk/test/widget_tests.py
+++ b/Lib/lib-tk/test/widget_tests.py
@@ -3,9 +3,9 @@
 import unittest
 import sys
 import Tkinter as tkinter
-from ttk import setup_master, Scale
-from test_ttk.support import (tcl_version, requires_tcl, get_tk_patchlevel,
-                              pixels_conv, tcl_obj_eq)
+from ttk import Scale
+from test_ttk.support import (AbstractTkTest, tcl_version, requires_tcl,
+                              get_tk_patchlevel, pixels_conv, tcl_obj_eq)
 import test.test_support
 
 
@@ -26,33 +26,26 @@
 
 _sentinel = object()
 
-class AbstractWidgetTest(object):
+class AbstractWidgetTest(AbstractTkTest):
     _conv_pixels = staticmethod(pixels_round)
     _conv_pad_pixels = None
-    wantobjects = True
+    _stringify = False
 
-    def setUp(self):
-        self.root = setup_master()
-        self.scaling = float(self.root.call('tk', 'scaling'))
-        if not self.root.wantobjects():
-            self.wantobjects = False
-
-    def tearDown(self):
-        for w in self.root.winfo_children():
-            w.destroy()
+    @property
+    def scaling(self):
+        try:
+            return self._scaling
+        except AttributeError:
+            self._scaling = float(self.root.call('tk', 'scaling'))
+            return self._scaling
 
     def _str(self, value):
-        if self.wantobjects and tcl_version >= (8, 6):
+        if not self._stringify and self.wantobjects and tcl_version >= (8, 6):
             return value
         if isinstance(value, tuple):
             return ' '.join(map(self._str, value))
         return str(value)
 
-    def create(self, **kwargs):
-        widget = self._create(**kwargs)
-        self.addCleanup(widget.destroy)
-        return widget
-
     def assertEqual2(self, actual, expected, msg=None, eq=object.__eq__):
         if eq(actual, expected):
             return
@@ -65,7 +58,7 @@
             expected = value
         if conv:
             expected = conv(expected)
-        if not self.wantobjects:
+        if self._stringify or not self.wantobjects:
             if isinstance(expected, tuple):
                 expected = tkinter._join(expected)
             else:
@@ -212,7 +205,7 @@
                 errmsg=errmsg)
 
     def checkImageParam(self, widget, name):
-        image = tkinter.PhotoImage('image1')
+        image = tkinter.PhotoImage(master=self.root, name='image1')
         self.checkParam(widget, name, image, conv=str)
         self.checkInvalidParam(widget, name, 'spam',
                 errmsg='image "spam" doesn\'t exist')
@@ -433,7 +426,7 @@
 
     def test_textvariable(self):
         widget = self.create()
-        var = tkinter.StringVar()
+        var = tkinter.StringVar(self.root)
         self.checkVariableParam(widget, 'textvariable', var)
 
     def test_troughcolor(self):
@@ -494,7 +487,7 @@
 
     def test_variable(self):
         widget = self.create()
-        var = tkinter.DoubleVar()
+        var = tkinter.DoubleVar(self.root)
         self.checkVariableParam(widget, 'variable', var)
 
 
diff --git a/Lib/test/test_ttk_guionly.py b/Lib/test/test_ttk_guionly.py
--- a/Lib/test/test_ttk_guionly.py
+++ b/Lib/test/test_ttk_guionly.py
@@ -13,23 +13,28 @@
 with test_support.DirsOnSysPath(lib_tk_test):
     import runtktests
 
+import Tkinter as tkinter
 import ttk
 from _tkinter import TclError
 
+root = None
 try:
-    ttk.Button()
-except TclError, msg:
+    root = tkinter.Tk()
+    button = ttk.Button(root)
+    button.destroy()
+    del button
+except TclError as msg:
     # assuming ttk is not available
     raise unittest.SkipTest("ttk not available: %s" % msg)
+finally:
+    if root is not None:
+        root.destroy()
+    del root
 
 def test_main():
     with test_support.DirsOnSysPath(lib_tk_test):
-        from test_ttk.support import get_tk_root
-        try:
-            test_support.run_unittest(
-                *runtktests.get_tests(text=False, packages=['test_ttk']))
-        finally:
-            get_tk_root().destroy()
+        test_support.run_unittest(
+            *runtktests.get_tests(text=False, packages=['test_ttk']))
 
 if __name__ == '__main__':
     test_main()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -19,6 +19,8 @@
 Library
 -------
 
+- Issue #22236: Fixed Tkinter images copying operations in NoDefaultRoot mode.
+
 - Issue #22191: Fixed warnings.__all__.
 
 - Issue #21308: Backport numerous features from Python's ssl module. This is
@@ -108,6 +110,9 @@
 Tests
 -----
 
+- Issue #22236: Tkinter tests now don't reuse default root window.  New root
+  window is created for every test class.
+
 - Issue #18004: test_overflow in test_list by mistake consumed 40 GiB of memory
   on 64-bit systems.
 

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


More information about the Python-checkins mailing list