Commit d7542918 authored by Serhiy Storchaka's avatar Serhiy Storchaka

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