]> granicus.if.org Git - python/commitdiff
Issue #22236: Tkinter tests now don't reuse default root window. New root
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 24 Aug 2014 06:07:09 +0000 (09:07 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Sun, 24 Aug 2014 06:07:09 +0000 (09:07 +0300)
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.

14 files changed:
Lib/lib-tk/Tkinter.py
Lib/lib-tk/test/test_tkinter/test_font.py
Lib/lib-tk/test/test_tkinter/test_geometry_managers.py
Lib/lib-tk/test/test_tkinter/test_images.py
Lib/lib-tk/test/test_tkinter/test_text.py
Lib/lib-tk/test/test_tkinter/test_variables.py
Lib/lib-tk/test/test_tkinter/test_widgets.py
Lib/lib-tk/test/test_ttk/support.py
Lib/lib-tk/test/test_ttk/test_extensions.py
Lib/lib-tk/test/test_ttk/test_style.py
Lib/lib-tk/test/test_ttk/test_widgets.py
Lib/lib-tk/test/widget_tests.py
Lib/test/test_ttk_guionly.py
Misc/NEWS

index bf5bc2881a8a328ce7835ab0e0bdb0e5339be367..76fbc07b49e92f32ebf36e9fee99d669ad117e7b 100644 (file)
@@ -563,6 +563,7 @@ class Misc:
                         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 @@ class Image:
             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 @@ class PhotoImage(Image):
     # 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
index dfb9fe4066788be2b3f945f5c16a714ae7223fc1..3eecd3241b2d96a1e440d34d545df17297be9b13 100644 (file)
@@ -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())
index adc127ff0b7840f7c4c9d83fa8006477a632cf64..78c1f02a235c1641027d79f361d71bca4ea268f3 100644 (file)
@@ -278,7 +278,7 @@ class PlaceTest(AbstractWidgetTest, unittest.TestCase):
 
     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 PlaceTest(AbstractWidgetTest, unittest.TestCase):
 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 @@ class GridTest(AbstractWidgetTest, unittest.TestCase):
 
     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 @@ class GridTest(AbstractWidgetTest, unittest.TestCase):
             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 @@ class GridTest(AbstractWidgetTest, unittest.TestCase):
             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('')
index b3c5b75dd81b228e8cebec0d358a06ab78d29e09..b9f977375f1d3dc27e075432d54184d1993572b6 100644 (file)
@@ -2,15 +2,12 @@ import unittest
 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 @@ class MiscTest(unittest.TestCase):
         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 @@ class BitmapImageTest(unittest.TestCase):
                          '-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)
index 1c636b44fdd5bee20082f120404f4d0fc4945954..a439b6c4f0d9e4ce6636fdd989aae2eb920efe9e 100644 (file)
@@ -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()
index a24ea38756460ffcda3b35f107ff8e7fa546a852..c11d8cdf99050a8a4fd321b93e095ef4cfd30c76 100644 (file)
@@ -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):
index 3f2e82672006e0ecd747b2869bf949e448976bf6..efb9a05f8149252406a7c9be6ef6683d38e83eee 100644 (file)
@@ -63,7 +63,7 @@ class ToplevelTest(AbstractToplevelTest, unittest.TestCase):
         '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 @@ class FrameTest(AbstractToplevelTest, unittest.TestCase):
         'relief', 'takefocus', 'visual', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Frame(self.root, **kwargs)
 
 
@@ -117,7 +117,7 @@ class LabelFrameTest(AbstractToplevelTest, unittest.TestCase):
         '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 @@ class LabelTest(AbstractLabelTest, unittest.TestCase):
         'underline', 'width', 'wraplength',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Label(self.root, **kwargs)
 
 
@@ -172,7 +172,7 @@ class ButtonTest(AbstractLabelTest, unittest.TestCase):
         '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 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
         'underline', 'variable', 'width', 'wraplength',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Checkbutton(self.root, **kwargs)
 
 
@@ -224,7 +224,7 @@ class RadiobuttonTest(AbstractLabelTest, unittest.TestCase):
         '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 @@ class MenubuttonTest(AbstractLabelTest, unittest.TestCase):
     )
     _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 @@ class MenubuttonTest(AbstractLabelTest, unittest.TestCase):
                      '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 MenubuttonTest(AbstractLabelTest, unittest.TestCase):
 
 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 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase):
         '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 @@ class SpinboxTest(EntryTest, unittest.TestCase):
         'width', 'wrap', 'xscrollcommand',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Spinbox(self.root, **kwargs)
 
     test_show = None
@@ -487,9 +487,9 @@ class TextTest(AbstractWidgetTest, unittest.TestCase):
         '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 @@ class CanvasTest(AbstractWidgetTest, unittest.TestCase):
     )
 
     _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 @@ class ListboxTest(AbstractWidgetTest, unittest.TestCase):
         '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 @@ class ListboxTest(AbstractWidgetTest, unittest.TestCase):
 
     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 @@ class ScaleTest(AbstractWidgetTest, unittest.TestCase):
     )
     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 @@ class ScrollbarTest(AbstractWidgetTest, unittest.TestCase):
         '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 @@ class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
     )
     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 @@ class MenuTest(AbstractWidgetTest, unittest.TestCase):
     )
     _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 @@ class MessageTest(AbstractWidgetTest, unittest.TestCase):
     )
     _conv_pad_pixels = noconv_meth
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return tkinter.Message(self.root, **kwargs)
 
     def test_aspect(self):
index fe0bff24b0dee450422c6da6ade1613b5560578f..a9d651ca2c710df0112ad3cb40458f847d68fd0d 100644 (file)
@@ -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
index 7d8bf93cd88e8cf036fc04ad70339baba774f5e4..57ffdddb7d8119fdc146b1bd73175ee0cb009bbf 100644 (file)
@@ -2,34 +2,30 @@ import sys
 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 @@ class LabeledScaleTest(unittest.TestCase):
         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 @@ class LabeledScaleTest(unittest.TestCase):
         # 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 @@ class LabeledScaleTest(unittest.TestCase):
         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 @@ class LabeledScaleTest(unittest.TestCase):
         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 @@ class LabeledScaleTest(unittest.TestCase):
 
 
     def test_variable_change(self):
-        x = ttk.LabeledScale()
+        x = ttk.LabeledScale(self.root)
         x.pack()
         x.wait_visibility()
         x.update()
@@ -151,13 +158,13 @@ class LabeledScaleTest(unittest.TestCase):
         # 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 @@ class LabeledScaleTest(unittest.TestCase):
 
 
     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 @@ class LabeledScaleTest(unittest.TestCase):
         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 @@ class OptionMenuTest(unittest.TestCase):
 
     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 @@ class OptionMenuTest(unittest.TestCase):
     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 @@ class OptionMenuTest(unittest.TestCase):
 
         # 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 @@ class OptionMenuTest(unittest.TestCase):
         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:
index 860a64a8b2001de23711e1896d31d9f60fddc323..fe122e738e4e8728516eb30b1817cdf5db055cbf 100644 (file)
@@ -2,15 +2,15 @@ import unittest
 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 @@ class StyleTest(unittest.TestCase):
         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)
 
index cb77db1a2a833dec2913e43e5365f8d6beb0586a..3138ae6c0e0770fec7b75db6b87e7a83de591017 100644 (file)
@@ -4,9 +4,9 @@ import ttk
 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 @@ class StandardTtkOptionsTests(StandardOptionsTests):
         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 @@ class FrameTest(AbstractToplevelTest, unittest.TestCase):
         'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Frame(self.root, **kwargs)
 
 
@@ -142,7 +138,7 @@ class LabelFrameTest(AbstractToplevelTest, unittest.TestCase):
         '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 LabelFrameTest(AbstractToplevelTest, unittest.TestCase):
 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 @@ class LabelTest(AbstractLabelTest, unittest.TestCase):
     )
     _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 @@ class ButtonTest(AbstractLabelTest, unittest.TestCase):
         'underline', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Button(self.root, **kwargs)
 
     def test_default(self):
@@ -226,7 +222,7 @@ class ButtonTest(AbstractLabelTest, unittest.TestCase):
 
     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 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
         '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 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
             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 @@ class ComboboxTest(AbstractWidgetTest, unittest.TestCase):
 
     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 @@ class ComboboxTest(AbstractWidgetTest, unittest.TestCase):
         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 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase):
 
     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 @@ class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
 
     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 @@ class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
         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 @@ class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
         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 @@ class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
         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 @@ class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
     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 @@ class RadiobuttonTest(AbstractLabelTest, unittest.TestCase):
         '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 @@ class RadiobuttonTest(AbstractLabelTest, unittest.TestCase):
             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 @@ class MenubuttonTest(AbstractLabelTest, unittest.TestCase):
         'underline', 'width',
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Menubutton(self.root, **kwargs)
 
     def test_direction(self):
@@ -775,17 +755,11 @@ class ScaleTest(AbstractWidgetTest, unittest.TestCase):
 
     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 @@ class ScaleTest(AbstractWidgetTest, unittest.TestCase):
         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 @@ class ProgressbarTest(AbstractWidgetTest, unittest.TestCase):
     _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 @@ class ScrollbarTest(AbstractWidgetTest, unittest.TestCase):
     )
     default_orient = 'vertical'
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Scrollbar(self.root, **kwargs)
 
 
@@ -933,21 +907,13 @@ class NotebookTest(AbstractWidgetTest, unittest.TestCase):
 
     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 @@ class NotebookTest(AbstractWidgetTest, unittest.TestCase):
         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 @@ class NotebookTest(AbstractWidgetTest, unittest.TestCase):
         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 @@ class NotebookTest(AbstractWidgetTest, unittest.TestCase):
         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 @@ class NotebookTest(AbstractWidgetTest, unittest.TestCase):
 
         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 @@ class NotebookTest(AbstractWidgetTest, unittest.TestCase):
         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 @@ class TreeviewTest(AbstractWidgetTest, unittest.TestCase):
 
     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 @@ class TreeviewTest(AbstractWidgetTest, unittest.TestCase):
 
     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 @@ class TreeviewTest(AbstractWidgetTest, unittest.TestCase):
 
         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 @@ class SeparatorTest(AbstractWidgetTest, unittest.TestCase):
     )
     default_orient = 'horizontal'
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Separator(self.root, **kwargs)
 
 
@@ -1624,7 +1584,7 @@ class SizegripTest(AbstractWidgetTest, unittest.TestCase):
         # 'state'?
     )
 
-    def _create(self, **kwargs):
+    def create(self, **kwargs):
         return ttk.Sizegrip(self.root, **kwargs)
 
 
index 15e7ce67681cb9673caddb926f7f382cb3125086..1b243246d148951c26ab4b3320782f91b67dc3e6 100644 (file)
@@ -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 @@ if get_tk_patchlevel()[:3] == (8, 5, 11):
 
 _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 @@ class AbstractWidgetTest(object):
             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 @@ class AbstractWidgetTest(object):
                 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 @@ class StandardOptionsTests(object):
 
     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 @@ class StandardOptionsTests(object):
 
     def test_variable(self):
         widget = self.create()
-        var = tkinter.DoubleVar()
+        var = tkinter.DoubleVar(self.root)
         self.checkVariableParam(widget, 'variable', var)
 
 
index caa69303ccc08dce38c28c1d26a17ba6526d924c..3f7ff65f2472dac75deb7d501f4ea672f1e77b26 100644 (file)
@@ -13,23 +13,28 @@ lib_tk_test = os.path.abspath(os.path.join(this_dir, os.path.pardir,
 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()
index 3ad6a9df5482b31ca8be191daad43aaf5f3a0d2f..61aab20984a5ae885e205f6e9bf814f0b9cccefb 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -19,6 +19,8 @@ Core and Builtins
 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 @@ Tools/Demos
 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.