with open(filename, 'wb') as f:
f.write(b"""
set a "<\xed\xa0\xbd\xed\xb2\xbb>"
+ """)
+ if tcl_version >= (9, 0):
+ self.assertRaises(TclError, tcl.evalfile, filename)
+ else:
+ tcl.evalfile(filename)
+ self.assertEqual(tcl.eval('set a'), '<\U0001f4bb>')
+
+ with open(filename, 'wb') as f:
+ f.write(b"""
set b "<\\ud83d\\udcbb>"
""")
tcl.evalfile(filename)
- self.assertEqual(tcl.eval('set a'), '<\U0001f4bb>')
self.assertEqual(tcl.eval('set b'), '<\U0001f4bb>')
def testEvalFileException(self):
requires('gui')
+EXPECTED_FLOAT_ERRMSG = 'expected floating-point number but got "{}"'
+EXPECTED_FLOAT_OR_EMPTY_ERRMSG = 'expected floating-point number (or "" )?but got "{}"'
+EXPECTED_SCREEN_DISTANCE_ERRMSG = '(bad|expected) screen distance (but got )?"{}"'
+EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG = '(bad|expected) screen distance (or "" but got )?"{}"'
+
class PackTest(AbstractWidgetTest, unittest.TestCase):
test_keys = None
self.assertEqual(f2.place_info()['x'], '-10')
self.root.update()
self.assertEqual(f2.winfo_x(), 190)
- with self.assertRaisesRegex(TclError, 'bad screen distance "spam"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('spam')):
f2.place_configure(in_=f, x='spam')
def test_place_configure_y(self):
self.assertEqual(f2.place_info()['y'], '-10')
self.root.update()
self.assertEqual(f2.winfo_y(), 110)
- with self.assertRaisesRegex(TclError, 'bad screen distance "spam"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('spam')):
f2.place_configure(in_=f, y='spam')
def test_place_configure_relx(self):
self.assertEqual(f2.place_info()['relx'], '1')
self.root.update()
self.assertEqual(f2.winfo_x(), 200)
- with self.assertRaisesRegex(TclError, 'expected floating-point number '
- 'but got "spam"'):
+ with self.assertRaisesRegex(TclError, EXPECTED_FLOAT_ERRMSG.format('spam')):
f2.place_configure(in_=f, relx='spam')
def test_place_configure_rely(self):
self.assertEqual(f2.place_info()['rely'], '1')
self.root.update()
self.assertEqual(f2.winfo_y(), 120)
- with self.assertRaisesRegex(TclError, 'expected floating-point number '
- 'but got "spam"'):
+ with self.assertRaisesRegex(TclError, EXPECTED_FLOAT_ERRMSG.format('spam')):
f2.place_configure(in_=f, rely='spam')
def test_place_configure_anchor(self):
f2.place_configure(width='')
self.root.update()
self.assertEqual(f2.winfo_width(), 30)
- with self.assertRaisesRegex(TclError, 'bad screen distance "abcd"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('abcd')):
f2.place_configure(width='abcd')
def test_place_configure_height(self):
f2.place_configure(height='')
self.root.update()
self.assertEqual(f2.winfo_height(), 60)
- with self.assertRaisesRegex(TclError, 'bad screen distance "abcd"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('abcd')):
f2.place_configure(height='abcd')
def test_place_configure_relwidth(self):
f2.place_configure(relwidth='')
self.root.update()
self.assertEqual(f2.winfo_width(), 30)
- with self.assertRaisesRegex(TclError, 'expected floating-point number '
- 'but got "abcd"'):
+ with self.assertRaisesRegex(TclError, EXPECTED_FLOAT_OR_EMPTY_ERRMSG.format('abcd')):
f2.place_configure(relwidth='abcd')
def test_place_configure_relheight(self):
f2.place_configure(relheight='')
self.root.update()
self.assertEqual(f2.winfo_height(), 60)
- with self.assertRaisesRegex(TclError, 'expected floating-point number '
- 'but got "abcd"'):
+ with self.assertRaisesRegex(TclError, EXPECTED_FLOAT_OR_EMPTY_ERRMSG.format('abcd')):
f2.place_configure(relheight='abcd')
def test_place_configure_bordermode(self):
self.assertEqual(self.root.grid_columnconfigure(0, 'weight'), 4)
def test_grid_columnconfigure_minsize(self):
- with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')):
self.root.grid_columnconfigure(0, minsize='foo')
self.root.grid_columnconfigure(0, minsize=10)
self.assertEqual(self.root.grid_columnconfigure(0, 'minsize'), 10)
self.assertEqual(self.root.grid_columnconfigure(0)['weight'], 3)
def test_grid_columnconfigure_pad(self):
- with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')):
self.root.grid_columnconfigure(0, pad='foo')
with self.assertRaisesRegex(TclError, 'invalid arg "-pad": '
'should be non-negative'):
self.assertEqual(self.root.grid_rowconfigure(0, 'weight'), 4)
def test_grid_rowconfigure_minsize(self):
- with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')):
self.root.grid_rowconfigure(0, minsize='foo')
self.root.grid_rowconfigure(0, minsize=10)
self.assertEqual(self.root.grid_rowconfigure(0, 'minsize'), 10)
self.assertEqual(self.root.grid_rowconfigure(0)['weight'], 3)
def test_grid_rowconfigure_pad(self):
- with self.assertRaisesRegex(TclError, 'bad screen distance "foo"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('foo')):
self.root.grid_rowconfigure(0, pad='foo')
with self.assertRaisesRegex(TclError, 'invalid arg "-pad": '
'should be non-negative'):
self.root.grid_location(0)
with self.assertRaises(TypeError):
self.root.grid_location(0, 0, 0)
- with self.assertRaisesRegex(TclError, 'bad screen distance "x"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('x')):
self.root.grid_location('x', 'y')
- with self.assertRaisesRegex(TclError, 'bad screen distance "y"'):
+ with self.assertRaisesRegex(TclError,
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('y')):
self.root.grid_location('1c', 'y')
t = self.root
# de-maximize
from tkinter import (Variable, StringVar, IntVar, DoubleVar, BooleanVar, Tcl,
TclError)
from test.support import ALWAYS_EQ
-from test.test_tkinter.support import AbstractDefaultRootTest
+from test.test_tkinter.support import AbstractDefaultRootTest, tcl_version
class Var(Variable):
self.assertTrue(v.side_effect)
def test_trace_old(self):
+ if tcl_version >= (9, 0):
+ self.skipTest('requires Tcl version < 9.0')
# Old interface
v = Variable(self.root)
vname = str(v)
import os
from test.support import requires
-from test.test_tkinter.support import (requires_tk,
+from test.test_tkinter.support import (requires_tk, tk_version,
get_tk_patchlevel, widget_eq,
AbstractDefaultRootTest)
from test.test_tkinter.widget_tests import (
requires('gui')
+EXPECTED_SCREEN_DISTANCE_ERRMSG = '(bad|expected) screen distance (but got )?"{}"'
+EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG = '(bad|expected) screen distance (or "" but got )?"{}"'
+
def float_round(x):
return float(round(x))
class AbstractLabelTest(AbstractWidgetTest, IntegerSizeTests):
_conv_pixels = False
-
- def test_configure_highlightthickness(self):
- widget = self.create()
- self.checkPixelsParam(widget, 'highlightthickness',
- 0, 1.3, 2.6, 6, -2, '10p')
+ _clip_highlightthickness = tk_version >= (8, 7)
+ _clip_pad = tk_version >= (8, 7)
+ _clip_borderwidth = tk_version >= (8, 7)
@add_standard_options(StandardOptionsTests)
'underline', 'width', 'wraplength',
)
_conv_pixels = round
+ _clip_highlightthickness = True
+ _clip_pad = True
+ _clip_borderwidth = False
def create(self, **kwargs):
return tkinter.Menubutton(self.root, **kwargs)
widget = self.create()
self.checkIntegerParam(widget, 'height', 100, -100, 0, conv=str)
- test_configure_highlightthickness = \
- StandardOptionsTests.test_configure_highlightthickness
-
def test_configure_image(self):
widget = self.create()
image = tkinter.PhotoImage(master=self.root, name='image1')
self.checkParam(widget, 'menu', menu, eq=widget_eq)
menu.destroy()
- def test_configure_padx(self):
- widget = self.create()
- self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m')
- self.checkParam(widget, 'padx', -2, expected=0)
-
- def test_configure_pady(self):
- widget = self.create()
- self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, '12m')
- self.checkParam(widget, 'pady', -2, expected=0)
-
def test_configure_width(self):
widget = self.create()
self.checkIntegerParam(widget, 'width', 402, -402, 0, conv=str)
widget = self.create()
self.checkParam(widget, 'to', 100.0)
self.checkFloatParam(widget, 'from', -10, 10.2, 11.7)
- self.checkInvalidParam(widget, 'from', 200,
- errmsg='-to value must be greater than -from value')
+ if tk_version >= (8, 7):
+ self.checkFloatParam(widget, 'from', 200, expected=100)
+ else:
+ self.checkInvalidParam(
+ widget, 'from', 200,
+ errmsg='-to value must be greater than -from value')
def test_configure_increment(self):
widget = self.create()
widget = self.create()
self.checkParam(widget, 'from', -100.0)
self.checkFloatParam(widget, 'to', -10, 10.2, 11.7)
- self.checkInvalidParam(widget, 'to', -200,
- errmsg='-to value must be greater than -from value')
+ if tk_version >= (8, 7):
+ self.checkFloatParam(widget, 'to', -200, expected=-100)
+ else:
+ self.checkInvalidParam(
+ widget, 'to', -200,
+ errmsg='-to value must be greater than -from value')
def test_configure_values(self):
# XXX
self.checkParam(widget, 'tabs', '2c left 4c 6c center',
expected=('2c', 'left', '4c', '6c', 'center'))
self.checkInvalidParam(widget, 'tabs', 'spam',
- errmsg='bad screen distance "spam"')
+ errmsg=EXPECTED_SCREEN_DISTANCE_ERRMSG.format('spam'))
def test_configure_tabstyle(self):
widget = self.create()
def test_create_polygon(self):
c = self.create()
- i1 = c.create_polygon(20, 30, 40, 50, 60, 10)
+ tk87 = tk_version >= (8, 7)
+ # In Tk < 8.7 polygons are filled, but has no outline by default.
+ # This affects its size, so always explicitly specify outline.
+ i1 = c.create_polygon(20, 30, 40, 50, 60, 10, outline='red')
self.assertEqual(c.coords(i1), [20.0, 30.0, 40.0, 50.0, 60.0, 10.0])
- self.assertEqual(c.bbox(i1), (19, 9, 61, 51))
+ self.assertEqual(c.bbox(i1), (18, 8, 62, 52))
self.assertEqual(c.itemcget(i1, 'joinstyle'), 'round')
self.assertEqual(c.itemcget(i1, 'smooth'), '0')
self.assertEqual(c.itemcget(i1, 'splinestep'), '12')
- i2 = c.create_polygon([21, 31, 41, 51, 61, 11])
+ i2 = c.create_polygon([21, 31, 41, 51, 61, 11], outline='red')
self.assertEqual(c.coords(i2), [21.0, 31.0, 41.0, 51.0, 61.0, 11.0])
- self.assertEqual(c.bbox(i2), (20, 10, 62, 52))
+ self.assertEqual(c.bbox(i2), (19, 9, 63, 53))
- i3 = c.create_polygon((22, 32), (42, 52), (62, 12))
+ i3 = c.create_polygon((22, 32), (42, 52), (62, 12), outline='red')
self.assertEqual(c.coords(i3), [22.0, 32.0, 42.0, 52.0, 62.0, 12.0])
- self.assertEqual(c.bbox(i3), (21, 11, 63, 53))
+ self.assertEqual(c.bbox(i3), (20, 10, 64, 54))
- i4 = c.create_polygon([(23, 33), (43, 53), (63, 13)])
+ i4 = c.create_polygon([(23, 33), (43, 53), (63, 13)], outline='red')
self.assertEqual(c.coords(i4), [23.0, 33.0, 43.0, 53.0, 63.0, 13.0])
- self.assertEqual(c.bbox(i4), (22, 12, 64, 54))
+ self.assertEqual(c.bbox(i4), (21, 11, 65, 55))
self.assertRaises(TclError, c.create_polygon, 20, 30, 60)
self.assertRaises(TclError, c.create_polygon, [20, 30, 60])
def test_configure_elementborderwidth(self):
widget = self.create()
- self.checkPixelsParam(widget, 'elementborderwidth', 4.3, 5.6, -2, '1m')
+ self.checkPixelsParam(widget, 'elementborderwidth', 4.3, 5.6, '1m')
+ expected = self._default_pixels if tk_version >= (8, 7) else -2
+ self.checkParam(widget, 'elementborderwidth', -2, expected=expected)
def test_configure_orient(self):
widget = self.create()
self.checkEnumParam(widget, 'orient', 'vertical', 'horizontal',
- errmsg='bad orientation "{}": must be vertical or horizontal')
+ fullname='orientation', allow_empty=True)
def test_activate(self):
sb = self.create()
@requires_tk(8, 6, 5)
def test_configure_proxyrelief(self):
widget = self.create()
- self.checkReliefParam(widget, 'proxyrelief')
+ self.checkReliefParam(widget, 'proxyrelief',
+ allow_empty=(tk_version >= (8, 7)))
def test_configure_sashcursor(self):
widget = self.create()
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'height', 10, 10)
self.check_paneconfigure_bad(p, b, 'height',
- 'bad screen distance "badValue"')
+ EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('badValue'))
def test_paneconfigure_hide(self):
p, b, c = self.create2()
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'minsize', 10, 10)
self.check_paneconfigure_bad(p, b, 'minsize',
- 'bad screen distance "badValue"')
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('badValue'))
def test_paneconfigure_padx(self):
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'padx', 1.3, 1)
self.check_paneconfigure_bad(p, b, 'padx',
- 'bad screen distance "badValue"')
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('badValue'))
def test_paneconfigure_pady(self):
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'pady', 1.3, 1)
self.check_paneconfigure_bad(p, b, 'pady',
- 'bad screen distance "badValue"')
+ EXPECTED_SCREEN_DISTANCE_ERRMSG.format('badValue'))
def test_paneconfigure_sticky(self):
p, b, c = self.create2()
p, b, c = self.create2()
self.check_paneconfigure(p, b, 'width', 10, 10)
self.check_paneconfigure_bad(p, b, 'width',
- 'bad screen distance "badValue"')
+ EXPECTED_SCREEN_DISTANCE_OR_EMPTY_ERRMSG.format('badValue'))
@add_standard_options(StandardOptionsTests)
def test_configure_type(self):
widget = self.create()
- opts = ('normal, tearoff, or menubar'
- if widget.info_patchlevel() < (8, 7) else
- 'menubar, normal, or tearoff')
- self.checkEnumParam(
- widget, 'type',
- 'normal', 'tearoff', 'menubar',
- errmsg='bad type "{}": must be ' + opts,
- )
+ values = ('normal', 'tearoff', 'menubar')
+ self.checkEnumParam(widget, 'type', *values,
+ allow_empty=tk_version < (8, 7),
+ sort=tk_version >= (8, 7))
def test_entryconfigure(self):
m1 = self.create()
'takefocus', 'text', 'textvariable', 'width',
)
_conv_pad_pixels = False
+ if tk_version >= (8, 7):
+ _conv_pixels = False
+ _clip_pad = tk_version >= (8, 7)
+ _clip_borderwidth = tk_version >= (8, 7)
def create(self, **kwargs):
return tkinter.Message(self.root, **kwargs)
widget = self.create()
self.checkIntegerParam(widget, 'aspect', 250, 0, -300)
+ def test_configure_padx(self):
+ widget = self.create()
+ self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m',
+ conv=self._conv_pad_pixels)
+ expected = self._default_pixels if self._clip_pad else -2
+ self.checkParam(widget, 'padx', -2, expected=expected)
+
+ def test_configure_pady(self):
+ widget = self.create()
+ self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, '12m',
+ conv=self._conv_pad_pixels)
+ expected = self._default_pixels if self._clip_pad else -2
+ self.checkParam(widget, 'pady', -2, expected=expected)
+
+ def test_configure_width(self):
+ widget = self.create()
+ self.checkPixelsParam(widget, 'width', 402, 403.4, 404.6, 0, '5i')
+ expected = 0 if tk_version >= (8, 7) else -402
+ self.checkParam(widget, 'width', -402, expected=expected)
+
class DefaultRootTest(AbstractDefaultRootTest, unittest.TestCase):
# Common tests for test_tkinter/test_widgets.py and test_ttk/test_widgets.py
+import re
import tkinter
from test.test_tkinter.support import (AbstractTkTest, tk_version,
pixels_conv, tcl_obj_eq)
_sentinel = object()
class AbstractWidgetTest(AbstractTkTest):
+ _default_pixels = '' if tk_version >= (9, 0) else -1 if tk_version >= (8, 7) else ''
_conv_pixels = round
_conv_pad_pixels = None
_stringify = False
+ _clip_highlightthickness = True
+ _clip_pad = False
+ _clip_borderwidth = False
@property
def scaling(self):
def checkInvalidParam(self, widget, name, value, errmsg=None):
orig = widget[name]
if errmsg is not None:
- errmsg = errmsg.format(value)
- with self.assertRaises(tkinter.TclError) as cm:
+ errmsg = errmsg.format(re.escape(str(value)))
+ errmsg = fr'\A{errmsg}\Z'
+ with self.assertRaisesRegex(tkinter.TclError, errmsg or ''):
widget[name] = value
- if errmsg is not None:
- self.assertEqual(str(cm.exception), errmsg)
self.assertEqual(widget[name], orig)
- with self.assertRaises(tkinter.TclError) as cm:
+ with self.assertRaisesRegex(tkinter.TclError, errmsg or ''):
widget.configure({name: value})
- if errmsg is not None:
- self.assertEqual(str(cm.exception), errmsg)
self.assertEqual(widget[name], orig)
def checkParams(self, widget, name, *values, **kwargs):
def checkIntegerParam(self, widget, name, *values, **kwargs):
self.checkParams(widget, name, *values, **kwargs)
- self.checkInvalidParam(widget, name, '',
- errmsg='expected integer but got ""')
- self.checkInvalidParam(widget, name, '10p',
- errmsg='expected integer but got "10p"')
- self.checkInvalidParam(widget, name, 3.2,
- errmsg='expected integer but got "3.2"')
+ errmsg = 'expected integer but got "{}"'
+ self.checkInvalidParam(widget, name, '', errmsg=errmsg)
+ self.checkInvalidParam(widget, name, '10p', errmsg=errmsg)
+ self.checkInvalidParam(widget, name, 3.2, errmsg=errmsg)
def checkFloatParam(self, widget, name, *values, conv=float, **kwargs):
for value in values:
self.checkParam(widget, name, value, conv=conv, **kwargs)
- self.checkInvalidParam(widget, name, '',
- errmsg='expected floating-point number but got ""')
- self.checkInvalidParam(widget, name, 'spam',
- errmsg='expected floating-point number but got "spam"')
+ errmsg = 'expected floating-point number but got "{}"'
+ self.checkInvalidParam(widget, name, '', errmsg=errmsg)
+ self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg)
def checkBooleanParam(self, widget, name):
for value in (False, 0, 'false', 'no', 'off'):
self.checkParam(widget, name, value, expected=0)
for value in (True, 1, 'true', 'yes', 'on'):
self.checkParam(widget, name, value, expected=1)
- self.checkInvalidParam(widget, name, '',
- errmsg='expected boolean value but got ""')
- self.checkInvalidParam(widget, name, 'spam',
- errmsg='expected boolean value but got "spam"')
+ errmsg = 'expected boolean value but got "{}"'
+ self.checkInvalidParam(widget, name, '', errmsg=errmsg)
+ self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg)
def checkColorParam(self, widget, name, *, allow_empty=None, **kwargs):
self.checkParams(widget, name,
self.assertTrue(widget[name])
self.checkParams(widget, name, '')
- def checkEnumParam(self, widget, name, *values, errmsg=None, **kwargs):
+ def checkEnumParam(self, widget, name, *values,
+ errmsg=None, allow_empty=False, fullname=None,
+ sort=False, **kwargs):
self.checkParams(widget, name, *values, **kwargs)
if errmsg is None:
+ if sort:
+ if values[-1]:
+ values = tuple(sorted(values))
+ else:
+ values = tuple(sorted(values[:-1])) + ('',)
errmsg2 = ' %s "{}": must be %s%s or %s' % (
- name,
+ fullname or name,
', '.join(values[:-1]),
',' if len(values) > 2 else '',
- values[-1])
- self.checkInvalidParam(widget, name, '',
- errmsg='ambiguous' + errmsg2)
+ values[-1] or '""')
+ if '' not in values and not allow_empty:
+ self.checkInvalidParam(widget, name, '',
+ errmsg='ambiguous' + errmsg2)
errmsg = 'bad' + errmsg2
self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg)
conv1 = round
self.checkParam(widget, name, value, expected=expected,
conv=conv1, **kwargs)
- self.checkInvalidParam(widget, name, '6x',
- errmsg='bad screen distance "6x"')
- self.checkInvalidParam(widget, name, 'spam',
- errmsg='bad screen distance "spam"')
+ errmsg = '(bad|expected) screen distance ((or "" )?but got )?"{}"'
+ self.checkInvalidParam(widget, name, '6x', errmsg=errmsg)
+ self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg)
- def checkReliefParam(self, widget, name):
- self.checkParams(widget, name,
- 'flat', 'groove', 'raised', 'ridge', 'solid', 'sunken')
- errmsg='bad relief "spam": must be '\
- 'flat, groove, raised, ridge, solid, or sunken'
+ def checkReliefParam(self, widget, name, *, allow_empty=False):
+ values = ('flat', 'groove', 'raised', 'ridge', 'solid', 'sunken')
+ if allow_empty:
+ values += ('',)
+ self.checkParams(widget, name, *values)
+ errmsg = 'bad relief "{}": must be %s, or %s' % (
+ ', '.join(values[:-1]),
+ values[-1] or '""')
if tk_version < (8, 6):
errmsg = None
- self.checkInvalidParam(widget, name, 'spam',
- errmsg=errmsg)
+ self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg)
def checkImageParam(self, widget, name):
image = tkinter.PhotoImage(master=self.root, name='image1')
def test_configure_borderwidth(self):
widget = self.create()
self.checkPixelsParam(widget, 'borderwidth',
- 0, 1.3, 2.6, 6, -2, '10p')
+ 0, 1.3, 2.6, 6, '10p')
+ expected = 0 if self._clip_borderwidth else -2
+ self.checkParam(widget, 'borderwidth', -2, expected=expected,
+ conv=self._conv_pixels)
if 'bd' in self.OPTIONS:
- self.checkPixelsParam(widget, 'bd', 0, 1.3, 2.6, 6, -2, '10p')
+ self.checkPixelsParam(widget, 'bd', 0, 1.3, 2.6, 6, '10p')
+ self.checkParam(widget, 'bd', -2, expected=expected,
+ conv=self._conv_pixels)
def test_configure_compound(self):
widget = self.create()
widget = self.create()
self.checkPixelsParam(widget, 'highlightthickness',
0, 1.3, 2.6, 6, '10p')
- self.checkParam(widget, 'highlightthickness', -2, expected=0,
+ expected = 0 if self._clip_highlightthickness else -2
+ self.checkParam(widget, 'highlightthickness', -2, expected=expected,
conv=self._conv_pixels)
def test_configure_image(self):
def test_configure_justify(self):
widget = self.create()
self.checkEnumParam(widget, 'justify', 'left', 'right', 'center',
- errmsg='bad justification "{}": must be '
- 'left, right, or center')
- self.checkInvalidParam(widget, 'justify', '',
- errmsg='ambiguous justification "": must be '
- 'left, right, or center')
+ fullname='justification')
def test_configure_orient(self):
widget = self.create()
def test_configure_padx(self):
widget = self.create()
- self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, -2, '12m',
+ self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m',
conv=self._conv_pad_pixels)
+ expected = 0 if self._clip_pad else -2
+ self.checkParam(widget, 'padx', -2, expected=expected,
+ conv=self._conv_pad_pixels)
def test_configure_pady(self):
widget = self.create()
- self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, -2, '12m',
+ self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, '12m',
conv=self._conv_pad_pixels)
+ expected = 0 if self._clip_pad else -2
+ self.checkParam(widget, 'pady', -2, expected=expected,
+ conv=self._conv_pad_pixels)
def test_configure_relief(self):
widget = self.create()
def test_configure_underline(self):
widget = self.create()
- self.checkIntegerParam(widget, 'underline', 0, 1, 10)
+ self.checkParams(widget, 'underline', 0, 1, 10)
+ if tk_version >= (8, 7):
+ is_ttk = widget.__class__.__module__ == 'tkinter.ttk'
+ self.checkParam(widget, 'underline', '',
+ expected='' if is_ttk else self._default_pixels)
+ self.checkParam(widget, 'underline', '5+2',
+ expected='5+2' if is_ttk else 7)
+ self.checkParam(widget, 'underline', '5-2',
+ expected='5-2' if is_ttk else 3)
+ self.checkParam(widget, 'underline', 'end', expected='end')
+ self.checkParam(widget, 'underline', 'end-2', expected='end-2')
+ errmsg = (r'bad index "{}": must be integer\?\[\+-\]integer\?, '
+ r'end\?\[\+-\]integer\?, or ""')
+ else:
+ errmsg = 'expected integer but got "{}"'
+ self.checkInvalidParam(widget, 'underline', '', errmsg=errmsg)
+ self.checkInvalidParam(widget, 'underline', '10p', errmsg=errmsg)
+ self.checkInvalidParam(widget, 'underline', 3.2, errmsg=errmsg)
def test_configure_wraplength(self):
widget = self.create()
def test_configure_overrelief(self):
widget = self.create()
- self.checkReliefParam(widget, 'overrelief')
+ self.checkReliefParam(widget, 'overrelief',
+ allow_empty=(tk_version >= (8, 7)))
def test_configure_selectcolor(self):
widget = self.create()
self.assertEqual(widget2['class'], 'Foo')
# XXX
+ def test_configure_relief(self):
+ widget = self.create()
+ self.checkReliefParam(widget, 'relief',
+ allow_empty=(tk_version >= (8, 7)))
+
class WidgetTest(AbstractTkTest, unittest.TestCase):
"""Tests methods available in every ttk widget."""
errmsg='image "spam" doesn\'t exist')
def test_configure_compound(self):
- options = 'none text image center top bottom left right'.split()
- errmsg = (
- 'bad compound "{}": must be'
- f' {", ".join(options[:-1])}, or {options[-1]}'
- )
+ values = ('none', 'text', 'image', 'center', 'top', 'bottom', 'left', 'right')
+ if tk_version >= (8, 7):
+ values += ('',)
widget = self.create()
- self.checkEnumParam(widget, 'compound', *options, errmsg=errmsg)
+ self.checkEnumParam(widget, 'compound', *values, allow_empty=True)
def test_configure_state(self):
widget = self.create()
self.checkParam(widget, 'font',
'-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*')
+ def test_configure_justify(self):
+ widget = self.create()
+ values = ('left', 'right', 'center')
+ if tk_version >= (8, 7):
+ values += ('',)
+ self.checkEnumParam(widget, 'justify', *values,
+ fullname='justification')
@add_standard_options(StandardTtkOptionsTests)
class ButtonTest(AbstractLabelTest, unittest.TestCase):
def test_configure_default(self):
widget = self.create()
- self.checkEnumParam(widget, 'default', 'normal', 'active', 'disabled')
+ values = ('normal', 'active', 'disabled')
+ self.checkEnumParam(widget, 'default', *values,
+ sort=tk_version >= (8, 7))
def test_invoke(self):
success = []
cbtn['command'] = ''
res = cbtn.invoke()
- self.assertFalse(str(res))
+ if tk_version >= (8, 7) and self.wantobjects:
+ self.assertEqual(res, ())
+ else:
+ self.assertEqual(str(res), '')
self.assertLessEqual(len(success), 1)
self.assertEqual(cbtn['offvalue'],
cbtn.tk.globalgetvar(cbtn['variable']))
self.assertEqual(self.combo.get(), getval)
self.assertEqual(self.combo.current(), currval)
- self.assertEqual(self.combo['values'], '')
+ self.assertIn(self.combo['values'], ((), ''))
check_get_current('', -1)
self.checkParam(self.combo, 'values', 'mon tue wed thur',
child2 = ttk.Label(self.root)
child3 = ttk.Label(self.root)
- self.assertRaises(tkinter.TclError, self.paned.insert, 0, child)
+ if tk_version >= (8, 7):
+ self.paned.insert(0, child)
+ self.assertEqual(self.paned.panes(), (str(child),))
+ self.paned.forget(0)
+ else:
+ self.assertRaises(tkinter.TclError, self.paned.insert, 0, child)
+ self.assertEqual(self.paned.panes(), ())
self.paned.insert('end', child2)
self.paned.insert(0, child)
self.assertEqual(self.paned.panes(), (str(child), str(child2)))
cbtn2['command'] = ''
res = cbtn2.invoke()
- self.assertEqual(str(res), '')
+ if tk_version >= (8, 7) and self.wantobjects:
+ self.assertEqual(res, ())
+ else:
+ self.assertEqual(str(res), '')
self.assertLessEqual(len(success), 1)
self.assertEqual(conv(cbtn2['value']), myvar.get())
self.assertEqual(myvar.get(),
def create(self, **kwargs):
return ttk.Menubutton(self.root, **kwargs)
- def test_direction(self):
+ def test_configure_direction(self):
widget = self.create()
- self.checkEnumParam(widget, 'direction',
- 'above', 'below', 'left', 'right', 'flush')
+ values = ('above', 'below', 'left', 'right', 'flush')
+ self.checkEnumParam(widget, 'direction', *values,
+ sort=tk_version >= (8, 7))
def test_configure_menu(self):
widget = self.create()
return ttk.Scrollbar(self.root, **kwargs)
-@add_standard_options(IntegerSizeTests, StandardTtkOptionsTests)
+@add_standard_options(PixelSizeTests if tk_version >= (8, 7) else IntegerSizeTests,
+ StandardTtkOptionsTests)
class NotebookTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'class', 'cursor', 'height', 'padding', 'style', 'takefocus', 'width',
)
+ if tk_version >= (8, 7):
+ _conv_pixels = False
def setUp(self):
super().setUp()
self.nb.insert(self.child1, child3)
self.assertEqual(self.nb.tabs(), (str(child3), ) + tabs)
self.nb.forget(child3)
- self.assertRaises(tkinter.TclError, self.nb.insert, 2, child3)
+ if tk_version >= (8, 7):
+ self.nb.insert(2, child3)
+ self.assertEqual(self.nb.tabs(), (*tabs, str(child3)))
+ else:
+ self.assertRaises(tkinter.TclError, self.nb.insert, 2, child3)
self.assertRaises(tkinter.TclError, self.nb.insert, -1, child3)
# bad inserts
self.checkParam(widget, 'columns', 'a b c',
expected=('a', 'b', 'c'))
self.checkParam(widget, 'columns', ('a', 'b', 'c'))
- self.checkParam(widget, 'columns', '')
+ self.checkParam(widget, 'columns', '',
+ expected=() if tk_version >= (8, 7) else '')
def test_configure_displaycolumns(self):
widget = self.create()
expected=('#all',))
self.checkParam(widget, 'displaycolumns', (2, 1, 0))
self.checkInvalidParam(widget, 'displaycolumns', ('a', 'b', 'd'),
- errmsg='Invalid column index d')
+ errmsg='Invalid column index "?d"?')
+ errmsg = 'Column index "?{}"? out of bounds'
self.checkInvalidParam(widget, 'displaycolumns', (1, 2, 3),
- errmsg='Column index 3 out of bounds')
+ errmsg=errmsg.format(3))
self.checkInvalidParam(widget, 'displaycolumns', (1, -2),
- errmsg='Column index -2 out of bounds')
+ errmsg=errmsg.format(-2))
def test_configure_height(self):
widget = self.create()