https://github.com/python/cpython/commit/a778fd600445f78a6f3f9bc97d44a9096a220ff0
commit: a778fd600445f78a6f3f9bc97d44a9096a220ff0
branch: 3.14
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-03-12T02:41:14+02:00
summary:

[3.14] gh-145736: Fix Tkinter tests for Tk 8.7, 9.0 and 9.1 (GH-145738) 
(GH-145841)

(cherry picked from commit 77d6d5d8fcc8565034dac378b2184131af735512)

files:
M Lib/test/test_tkinter/test_widgets.py
M Lib/test/test_tkinter/widget_tests.py
M Lib/test/test_ttk/test_widgets.py

diff --git a/Lib/test/test_tkinter/test_widgets.py 
b/Lib/test/test_tkinter/test_widgets.py
index ca9dd28b5ed17e..fe28ebd24a4922 100644
--- a/Lib/test/test_tkinter/test_widgets.py
+++ b/Lib/test/test_tkinter/test_widgets.py
@@ -26,12 +26,8 @@ def float_round(x):
     return float(round(x))
 
 class AbstractToplevelTest(AbstractWidgetTest, PixelSizeTests):
-    if tk_version < (9, 0):
-        _no_round = {'padx', 'pady'}
-    else:
-        _no_round = {'borderwidth', 'height', 'highlightthickness', 'padx',
-                     'pady', 'width'}
-    if tk_version < (9, 0):
+    _no_round = {'padx', 'pady'}
+    if tk_version < (8, 7):
         _clipped = {'highlightthickness'}
     else:
         _clipped = {'borderwidth', 'height', 'highlightthickness', 'padx',
@@ -122,11 +118,6 @@ class FrameTest(AbstractToplevelTest, unittest.TestCase):
         'highlightbackground', 'highlightcolor', 'highlightthickness',
         'padx', 'pady', 'relief', 'takefocus', 'tile', 'visual', 'width',
     )
-    if tk_version < (9, 0):
-        _no_round = {'padx', 'pady'}
-    else:
-        _no_round = {'borderwidth', 'height', 'highlightthickness', 'padx',
-                     'pady', 'width'}
 
     def create(self, **kwargs):
         return tkinter.Frame(self.root, **kwargs)
@@ -142,11 +133,6 @@ class LabelFrameTest(AbstractToplevelTest, 
unittest.TestCase):
         'labelanchor', 'labelwidget', 'padx', 'pady', 'relief',
         'takefocus', 'text', 'visual', 'width',
     )
-    if tk_version < (9, 0):
-        _no_round = {'padx', 'pady'}
-    else:
-        _no_round = {'borderwidth', 'height', 'highlightthickness', 'padx',
-                     'pady', 'width'}
 
     def create(self, **kwargs):
         return tkinter.LabelFrame(self.root, **kwargs)
@@ -167,11 +153,19 @@ def test_configure_labelwidget(self):
 # Label, Button, Checkbutton, Radiobutton, MenuButton
 class AbstractLabelTest(AbstractWidgetTest, IntegerSizeTests):
     _rounds_pixels = False
-    if tk_version < (9, 0):
+    if tk_version < (8, 7):
         _clipped = {}
+    elif tk_version < (9, 0):
+        _clipped = {'borderwidth', 'height', 'highlightthickness', 'padx', 
'pady', 'width'}
     else:
-        _clipped = {'borderwidth', 'insertborderwidth', 'highlightthickness',
-                    'padx', 'pady'}
+        _clipped = {'borderwidth', 'height', 'highlightthickness',
+                    'insertborderwidth', 'padx', 'pady', 'width'}
+
+    def setUp(self):
+        super().setUp()
+        if tk_version[:2] == (9, 0) and get_tk_patchlevel(self.root) < (9, 0, 
2):
+            self._clipped = self._clipped - {'height', 'width'}
+
 
 @add_configure_tests(StandardOptionsTests)
 class LabelTest(AbstractLabelTest, unittest.TestCase):
@@ -201,6 +195,11 @@ class ButtonTest(AbstractLabelTest, unittest.TestCase):
         'repeatdelay', 'repeatinterval',
         'state', 'takefocus', 'text', 'textvariable',
         'underline', 'width', 'wraplength')
+    if tk_version < (8, 7):
+        _clipped = {}
+    else:
+        _clipped = {'borderwidth', 'height', 'highlightthickness',
+                    'padx', 'pady', 'width'}
 
     def create(self, **kwargs):
         return tkinter.Button(self.root, **kwargs)
@@ -301,10 +300,17 @@ class MenubuttonTest(AbstractLabelTest, 
unittest.TestCase):
         'underline', 'width', 'wraplength',
     )
     _rounds_pixels = (tk_version < (9, 0))
-    if tk_version < (9, 0):
+    if tk_version < (8, 7):
         _clipped = {'highlightthickness', 'padx', 'pady'}
+    elif tk_version < (9, 0):
+        _clipped = {'borderwidth', 'highlightthickness', 'padx', 'pady'}
     else:
-        _clipped ={ 'insertborderwidth', 'highlightthickness', 'padx', 'pady'}
+        _clipped = {'borderwidth', 'highlightthickness', 'insertborderwidth', 
'padx', 'pady'}
+
+    def setUp(self):
+        super().setUp()
+        if tk_version[:2] == (9, 0) and get_tk_patchlevel(self.root) < (9, 0, 
1):
+            self._clipped = self._clipped - {'borderwidth'}
 
     def create(self, **kwargs):
         return tkinter.Menubutton(self.root, **kwargs)
@@ -316,13 +322,17 @@ def test_configure_direction(self):
 
     def test_configure_height(self):
         widget = self.create()
-        self.checkIntegerParam(widget, 'height', 100, -100, 0, conv=str)
+        if tk_version < (8, 7) or (tk_version[:2] == (9, 0) and 
get_tk_patchlevel(self.root) < (9, 0, 1)):
+            conv = str
+        else:
+            conv = False
+        self.checkIntegerParam(widget, 'height', 100, -100, 0, conv=conv)
 
     def test_configure_image(self):
         widget = self.create()
         image = tkinter.PhotoImage(master=self.root, name='image1')
         self.checkParam(widget, 'image', image, conv=str)
-        if tk_version < (9, 0):
+        if tk_version < (8, 7):
             errmsg = 'image "spam" doesn\'t exist'
         else:
             errmsg = 'image "spam" does not exist'
@@ -343,7 +353,11 @@ def test_configure_menu(self):
 
     def test_configure_width(self):
         widget = self.create()
-        self.checkIntegerParam(widget, 'width', 402, -402, 0, conv=str)
+        if tk_version < (8, 7) or (tk_version[:2] == (9, 0) and 
get_tk_patchlevel(self.root) < (9, 0, 1)):
+            conv = str
+        else:
+            conv = False
+        self.checkIntegerParam(widget, 'width', 402, -402, 0, conv=conv)
 
 
 class OptionMenuTest(MenubuttonTest, unittest.TestCase):
@@ -362,12 +376,11 @@ def test_specify_name(self):
 
 @add_configure_tests(IntegerSizeTests, StandardOptionsTests)
 class EntryTest(AbstractWidgetTest, unittest.TestCase):
-    _rounds_pixels = (tk_version < (9, 0))
-    if tk_version < (9, 0):
+    if tk_version < (8, 7):
         _clipped = {'highlightthickness'}
     else:
-        _clipped = {'highlightthickness', 'borderwidth', 'insertborderwidth',
-                    'selectborderwidth'}
+        _clipped = {'borderwidth', 'highlightthickness', 'insertborderwidth',
+                    'insertwidth', 'selectborderwidth'}
 
     OPTIONS = (
         'background', 'borderwidth', 'cursor',
@@ -393,23 +406,20 @@ def test_configure_disabledbackground(self):
     def test_configure_insertborderwidth(self):
         widget = self.create(insertwidth=100)
         self.checkPixelsParam(widget, 'insertborderwidth',
-                              0, 1.3, 2.6, 6, '10p')
-        self.checkParam(widget, 'insertborderwidth', -2)
+                              0, 1.3, 2.6, 6, -2, '10p')
         # insertborderwidth is bounded above by a half of insertwidth.
-        expected =  100 // 2 if tk_version < (9, 0) else 60
+        expected =  100 // 2 if tk_version < (8, 7) else 60
         self.checkParam(widget, 'insertborderwidth', 60, expected=expected)
 
     def test_configure_insertwidth(self):
         widget = self.create()
-        self.checkPixelsParam(widget, 'insertwidth', 1.3, 3.6, '10p')
-        if tk_version < (9, 0):
+        self.checkPixelsParam(widget, 'insertwidth', 1.3, 3.6, 0.9, '10p')
+        if tk_version < (8, 7):
+            self.checkParam(widget, 'insertwidth', 0, expected=2)
             self.checkParam(widget, 'insertwidth', 0.1, expected=2)
             self.checkParam(widget, 'insertwidth', -2, expected=2)
-            self.checkParam(widget, 'insertwidth', 0.9, expected=1)
         else:
-            self.checkParam(widget, 'insertwidth', 0.1)
-            self.checkParam(widget, 'insertwidth', -2, expected=0)
-            self.checkParam(widget, 'insertwidth', 0.9)
+            self.checkPixelsParam(widget, 'insertwidth', 0, 0.1, -2)
 
     def test_configure_invalidcommand(self):
         widget = self.create()
@@ -552,9 +562,19 @@ def test_configure_values(self):
         # XXX
         widget = self.create()
         self.assertEqual(widget['values'], '')
-        self.checkParam(widget, 'values', 'mon tue wed thur')
+        if tk_version < (8, 7) or (tk_version[:2] == (9, 0) and 
get_tk_patchlevel(self.root) < (9, 0, 1)):
+            expected = 'mon tue wed thur'
+        else:
+            expected = ('mon', 'tue', 'wed', 'thur')
+        self.checkParam(widget, 'values', 'mon tue wed thur',
+                        expected=expected)
         self.checkParam(widget, 'values', ('mon', 'tue', 'wed', 'thur'),
-                        expected='mon tue wed thur')
+                        expected=expected)
+
+        if tk_version < (8, 7) or (tk_version[:2] == (9, 0) and 
get_tk_patchlevel(self.root) < (9, 0, 1)):
+            expected = '42 3.14 {} {any string}'
+        else:
+            expected = (42, 3.14, '', 'any string')
         self.checkParam(widget, 'values', (42, 3.14, '', 'any string'),
                         expected='42 3.14 {} {any string}')
         self.checkParam(widget, 'values', '')
@@ -619,9 +639,20 @@ class TextTest(AbstractWidgetTest, unittest.TestCase):
         'tabs', 'tabstyle', 'takefocus', 'undo', 'width', 'wrap',
         'xscrollcommand', 'yscrollcommand',
     )
-    _rounds_pixels = (tk_version < (9, 0))
     _no_round = {'selectborderwidth'}
-    _clipped = {'highlightthickness'}
+    if tk_version < (9, 0):
+        _clipped = {'highlightthickness', 'spacing1', 'spacing2', 'spacing3'}
+    else:
+        _clipped = {'borderwidth', 'height', 'highlightthickness',
+                    'insertborderwidth', 'insertwidth', 'padx', 'pady',
+                    'selectborderwidth', 'spacing1', 'spacing2', 'spacing3'}
+
+    def setUp(self):
+        super().setUp()
+        if tk_version[:2] == (9, 0) and get_tk_patchlevel(self.root) < (9, 0, 
2):
+            self._clipped = self._clipped - {'borderwidth', 'height', 'padx', 
'pady'}
+        if tk_version[:2] == (9, 0) and get_tk_patchlevel(self.root) < (9, 0, 
1):
+            self._clipped = self._clipped - {'insertborderwidth', 
'insertwidth', 'selectborderwidth'}
 
     def create(self, **kwargs):
         return tkinter.Text(self.root, **kwargs)
@@ -650,10 +681,11 @@ def test_configure_endline(self):
     def test_configure_height(self):
         widget = self.create()
         self.checkPixelsParam(widget, 'height', 100, 101.2, 102.6, '3c')
-        self.checkParam(widget, 'height', -100,
-                            expected=1 if tk_version < (9, 0) else -100)
-        self.checkParam(widget, 'height', 0,
-                            expected=1 if tk_version < (9, 0) else 0 )
+        if tk_version < (9, 0):
+            self.checkParam(widget, 'height', 0, expected=1)
+            self.checkParam(widget, 'height', -100, expected=1)
+        else:
+            self.checkPixelsParam(widget, 'height', 0, -100)
 
     def test_configure_maxundo(self):
         widget = self.create()
@@ -669,25 +701,17 @@ def test_configure_insertunfocussed(self):
         self.checkEnumParam(widget, 'insertunfocussed',
                             'hollow', 'none', 'solid')
 
-    def test_configure_selectborderwidth(self):
-        widget = self.create()
-        self.checkPixelsParam(widget, 'selectborderwidth',
-                              1.3, 2.6, -2, '10p', conv=False)
-
     def test_configure_spacing1(self):
         widget = self.create()
-        self.checkPixelsParam(widget, 'spacing1', 20, 21.4, 22.6, '0.5c')
-        self.checkParam(widget, 'spacing1', -5, expected=0)
+        self.checkPixelsParam(widget, 'spacing1', 20, 21.4, 22.6, -5, '0.5c')
 
     def test_configure_spacing2(self):
         widget = self.create()
-        self.checkPixelsParam(widget, 'spacing2', 5, 6.4, 7.6, '0.1c')
-        self.checkParam(widget, 'spacing2', -1, expected=0)
+        self.checkPixelsParam(widget, 'spacing2', 5, 6.4, 7.6, -1, '0.1c')
 
     def test_configure_spacing3(self):
         widget = self.create()
-        self.checkPixelsParam(widget, 'spacing3', 20, 21.4, 22.6, '0.5c')
-        self.checkParam(widget, 'spacing3', -10, expected=0)
+        self.checkPixelsParam(widget, 'spacing3', 20, 21.4, 22.6, -10, '0.5c')
 
     def test_configure_startline(self):
         widget = self.create()
@@ -760,17 +784,22 @@ class CanvasTest(AbstractWidgetTest, unittest.TestCase):
         'xscrollcommand', 'xscrollincrement',
         'yscrollcommand', 'yscrollincrement', 'width',
     )
-    _rounds_pixels = True
-    if tk_version < (9, 0):
-        _noround = {}
+    if tk_version < (8, 7):
         _clipped = {'highlightthickness'}
     else:
-        _no_round = {'borderwidth', 'height', 'highlightthickness', 'width',
-                     'xscrollincrement', 'yscrollincrement'}
-        _clipped = {'borderwidth', 'height', 'highlightthickness', 'width',
-                    'xscrollincrement', 'yscrollincrement'}
+        _clipped = {'borderwidth', 'height', 'highlightthickness',
+                    'insertborderwidth', 'insertwidth', 'selectborderwidth',
+                    'width', 'xscrollincrement', 'yscrollincrement'}
     _stringify = True
 
+    def setUp(self):
+        super().setUp()
+        if tk_version[:2] == (9, 0) and get_tk_patchlevel(self.root) < (9, 0, 
1):
+            self._rounds_pixels = True
+            self._no_round = {'borderwidth', 'height', 'highlightthickness',
+                              'width', 'xscrollincrement', 'yscrollincrement'}
+            self._clipped = self._clipped - {'insertborderwidth', 
'insertwidth', 'selectborderwidth'}
+
     def create(self, **kwargs):
         return tkinter.Canvas(self.root, **kwargs)
 
@@ -917,7 +946,6 @@ def test_create_line(self):
 
     def test_create_polygon(self):
         c = self.create()
-        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')
@@ -1022,11 +1050,10 @@ class ListboxTest(AbstractWidgetTest, 
unittest.TestCase):
         'selectmode', 'setgrid', 'state',
         'takefocus', 'width', 'xscrollcommand', 'yscrollcommand',
     )
-    _rounds_pixels = (tk_version < (9, 0))
-    if tk_version < (9, 0):
+    if tk_version < (8, 7):
         _clipped = {'highlightthickness'}
     else:
-        _clipped = { 'borderwidth', 'highlightthickness', 'selectborderwidth'}
+        _clipped = {'borderwidth', 'highlightthickness', 'selectborderwidth'}
 
     def create(self, **kwargs):
         return tkinter.Listbox(self.root, **kwargs)
@@ -1164,7 +1191,6 @@ class ScaleTest(AbstractWidgetTest, unittest.TestCase):
         'resolution', 'showvalue', 'sliderlength', 'sliderrelief', 'state',
         'takefocus', 'tickinterval', 'to', 'troughcolor', 'variable', 'width',
     )
-    _rounds_pixels = (tk_version < (9, 0))
     _clipped = {'highlightthickness'}
     default_orient = 'vertical'
 
@@ -1234,14 +1260,13 @@ class ScrollbarTest(AbstractWidgetTest, 
unittest.TestCase):
         'repeatdelay', 'repeatinterval',
         'takefocus', 'troughcolor', 'width',
     )
-    _rounds_pixels = True
-    if tk_version >= (9, 0):
-        _no_round = {'borderwidth', 'elementborderwidth', 'highlightthickness',
-                     'width'}
-    if tk_version < (9, 0):
+    if tk_version < (8, 7):
         _clipped = {'highlightthickness'}
+    elif tk_version < (9, 0):
+        _clipped = {'borderwidth', 'elementborderwidth', 'highlightthickness'}
     else:
-        _clipped = {'borderwidth', 'highlightthickness', 'width'}
+        _clipped = {'borderwidth', 'elementborderwidth', 'highlightthickness', 
'width'}
+    _clipped_to_default = {'elementborderwidth'}
     _stringify = True
     default_orient = 'vertical'
 
@@ -1250,9 +1275,7 @@ def create(self, **kwargs):
 
     def test_configure_elementborderwidth(self):
         widget = self.create()
-        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)
+        self.checkPixelsParam(widget, 'elementborderwidth', 4.3, 5.6, -2, '1m')
 
     def test_configure_orient(self):
         widget = self.create()
@@ -1279,7 +1302,7 @@ def test_set(self):
         self.assertRaises(TypeError, sb.set, 0.6, 0.7, 0.8)
 
 
-@add_configure_tests(StandardOptionsTests)
+@add_configure_tests(PixelSizeTests, StandardOptionsTests)
 class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
     OPTIONS = (
         'background', 'borderwidth', 'cursor',
@@ -1290,14 +1313,8 @@ class PanedWindowTest(AbstractWidgetTest, 
unittest.TestCase):
         'sashcursor', 'sashpad', 'sashrelief', 'sashwidth',
         'showhandle', 'width',
     )
-    _rounds_pixels = True
-    if tk_version < (9, 0):
-        _no_round = {'handlesize', 'height', 'proxyborderwidth', 'sashwidth',
-                     'selectborderwidth', 'width'}
-    else:
-        _no_round = {'borderwidth', 'handlepad', 'handlesize', 'height',
-                     'proxyborderwidth', 'sashpad', 'sashwidth',
-                     'selectborderwidth', 'width'}
+    _no_round = {'handlesize', 'height', 'proxyborderwidth', 'sashwidth',
+                 'selectborderwidth', 'width'}
     _clipped = {}
     default_orient = 'horizontal'
 
@@ -1310,13 +1327,7 @@ def test_configure_handlepad(self):
 
     def test_configure_handlesize(self):
         widget = self.create()
-        self.checkPixelsParam(widget, 'handlesize', 8, 9.4, 10.6, -3, '2m',
-                              conv=False)
-
-    def test_configure_height(self):
-        widget = self.create()
-        self.checkPixelsParam(widget, 'height', 100, 101.2, 102.6, -100, 0, 
'1i',
-                              conv=False)
+        self.checkPixelsParam(widget, 'handlesize', 8, 9.4, 10.6, -3, '2m')
 
     def test_configure_opaqueresize(self):
         widget = self.create()
@@ -1331,8 +1342,7 @@ def test_configure_proxybackground(self):
     def test_configure_proxyborderwidth(self):
         widget = self.create()
         self.checkPixelsParam(widget, 'proxyborderwidth',
-                              0, 1.3, 2.9, 6, -2, '10p',
-                              conv=False)
+                              0, 1.3, 2.9, 6, -2, '10p')
 
     @requires_tk(8, 6, 5)
     def test_configure_proxyrelief(self):
@@ -1354,18 +1364,12 @@ def test_configure_sashrelief(self):
 
     def test_configure_sashwidth(self):
         widget = self.create()
-        self.checkPixelsParam(widget, 'sashwidth', 10, 11.1, 15.6, -3, '1m',
-                              conv=False)
+        self.checkPixelsParam(widget, 'sashwidth', 10, 11.1, 15.6, -3, '1m')
 
     def test_configure_showhandle(self):
         widget = self.create()
         self.checkBooleanParam(widget, 'showhandle')
 
-    def test_configure_width(self):
-        widget = self.create()
-        self.checkPixelsParam(widget, 'width', 402, 403.4, 404.6, -402, 0, 
'5i',
-                              conv=False)
-
     def create2(self):
         p = self.create()
         b = tkinter.Button(p)
@@ -1547,12 +1551,12 @@ class MessageTest(AbstractWidgetTest, 
unittest.TestCase):
         'justify', 'padx', 'pady', 'relief',
         'takefocus', 'text', 'textvariable', 'width',
     )
-    _rounds_pixels = (tk_version < (9, 0))
     _no_round = {'padx', 'pady'}
-    if tk_version < (9, 0):
+    if tk_version < (8, 7):
         _clipped = {'highlightthickness'}
     else:
-        _clipped = {'borderwidth', 'highlightthickness', 'padx', 'pady'}
+        _clipped = {'borderwidth', 'highlightthickness', 'padx', 'pady', 
'width'}
+    _clipped_to_default = {'padx', 'pady'}
 
     def create(self, **kwargs):
         return tkinter.Message(self.root, **kwargs)
@@ -1561,24 +1565,6 @@ def test_configure_aspect(self):
         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')
-        expected = -2 if tk_version < (9, 0) else self._default_pixels
-        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')
-        expected = -2 if tk_version < (9, 0) else self._default_pixels
-        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):
 
diff --git a/Lib/test/test_tkinter/widget_tests.py 
b/Lib/test/test_tkinter/widget_tests.py
index f518925e994e90..94244a8b3fe244 100644
--- a/Lib/test/test_tkinter/widget_tests.py
+++ b/Lib/test/test_tkinter/widget_tests.py
@@ -12,11 +12,12 @@
 # borderwidth = bd
 
 class AbstractWidgetTest(AbstractTkTest):
-    _default_pixels = ''   # Value for unset pixel options.
-    _rounds_pixels = True  # True if some pixel options are rounded.
-    _no_round = {}         # Pixel options which are not rounded nonetheless
+    _default_pixels = '' if tk_version >= (9, 0) else -1  # Value for unset 
pixel options.
+    _rounds_pixels = (tk_version < (9, 0))  # True if some pixel options are 
rounded.
+    _no_round = set()      # Pixel options which are not rounded nonetheless
     _stringify = False     # Whether to convert tuples to strings
     _allow_empty_justify = False
+    _clipped_to_default = set()
 
     @property
     def scaling(self):
@@ -43,9 +44,12 @@ def checkParam(self, widget, name, value, *, 
expected=_sentinel,
         widget[name] = value
         if expected is _sentinel:
             expected = value
-        if name in self._clipped:
-            if not isinstance(expected, str):
-                expected = max(expected, 0)
+            if name in self._clipped:
+                if not isinstance(expected, str) and expected < 0:
+                    if tk_version >= (8, 7) and name in 
self._clipped_to_default:
+                        expected = self._default_pixels
+                    else:
+                        expected = 0
         if conv:
             expected = conv(expected)
         if self._stringify or not self.wantobjects:
@@ -143,10 +147,10 @@ def checkEnumParam(self, widget, name, *values,
         self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg)
 
     def checkPixelsParam(self, widget, name, *values, conv=None, **kwargs):
-        if not self._rounds_pixels or name in self._no_round:
-            conv = False
-        elif conv != str:
-            conv = round
+        if conv is None:
+            if self._rounds_pixels and name not in self._no_round:
+                conv = round
+        alow_neg = tk_version < (9, 1)
         for value in values:
             expected = _sentinel
             conv1 = conv
@@ -156,6 +160,9 @@ def checkPixelsParam(self, widget, name, *values, 
conv=None, **kwargs):
                 if conv1 and conv1 is not str:
                     expected = pixels_conv(value) * self.scaling
                     conv1 = round
+            elif not alow_neg and isinstance(value, (int, float)) and value < 
0:
+                self.checkInvalidParam(widget, name, value)
+                continue
             self.checkParam(widget, name, value, expected=expected,
                             conv=conv1, **kwargs)
         errmsg = '(bad|expected) screen distance ((or "" )?but got )?"{}"'
@@ -177,7 +184,7 @@ def checkReliefParam(self, widget, name, *, 
allow_empty=False):
     def checkImageParam(self, widget, name):
         image = tkinter.PhotoImage(master=self.root, name='image1')
         self.checkParam(widget, name, image, conv=str)
-        if tk_version < (9, 0):
+        if tk_version < (8, 7):
             errmsg = 'image "spam" doesn\'t exist'
         else:
             errmsg = 'image "spam" does not exist'
@@ -246,8 +253,8 @@ def test_configure_activeborderwidth(self):
     def test_configure_borderwidth(self):
         widget = self.create()
         self.checkPixelsParam(widget, 'borderwidth',
-                              0, 1.3, 2.6, 6, '10p')
-        self.checkParam(widget, 'borderwidth', -2)
+                              0, 1.3, 2.6, 6, -2, '10p')
+
         if 'bd' in self.OPTIONS:
             self.checkPixelsParam(widget, 'bd', 0, 1.3, 2.6, 6, '10p')
             self.checkParam(widget, 'bd', -2, expected=expected)
@@ -255,14 +262,11 @@ def test_configure_borderwidth(self):
     def test_configure_highlightthickness(self):
         widget = self.create()
         self.checkPixelsParam(widget, 'highlightthickness',
-                              0, 1.3, 2.6, 6, '10p')
-        self.checkParam(widget, 'highlightthickness', -2)
+                              0, 1.3, 2.6, 6, -2, '10p')
 
     def test_configure_insertborderwidth(self):
         widget = self.create()
-        self.checkPixelsParam(widget, 'insertborderwidth',
-                              0, 1.3, 2.6, 6, '10p')
-        self.checkParam(widget, 'insertborderwidth', -2)
+        self.checkPixelsParam(widget, 'insertborderwidth', 0, 1.3, 2.6, 6, -2, 
'10p')
 
     def test_configure_insertwidth(self):
         widget = self.create()
@@ -270,18 +274,17 @@ def test_configure_insertwidth(self):
 
     def test_configure_padx(self):
         widget = self.create()
-        self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, '12m')
-        self.checkParam(widget, 'padx', -2)
+        self.checkPixelsParam(widget, 'padx', 3, 4.4, 5.6, -2, '12m')
 
     def test_configure_pady(self):
         widget = self.create()
-        self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, '12m')
-        self.checkParam(widget, 'pady', -2)
+        self.checkPixelsParam(widget, 'pady', 3, 4.4, 5.6, -2, '12m')
 
     def test_configure_selectborderwidth(self):
         widget = self.create()
         self.checkPixelsParam(widget, 'selectborderwidth', 1.3, 2.6, -2, '10p')
 
+
 class StandardOptionsTests(PixelOptionsTests):
 
     STANDARD_OPTIONS = ( 'activebackground', 'activeforeground',
diff --git a/Lib/test/test_ttk/test_widgets.py 
b/Lib/test/test_ttk/test_widgets.py
index e738fbff82ed43..8cce9aed9d514f 100644
--- a/Lib/test/test_ttk/test_widgets.py
+++ b/Lib/test/test_ttk/test_widgets.py
@@ -183,7 +183,7 @@ def checkImageParam(self, widget, name):
                         expected=('image1', 'active', 'image2'))
         self.checkParam(widget, name, 'image1 active image2',
                         expected=('image1', 'active', 'image2'))
-        if tk_version < (9, 0):
+        if tk_version < (8, 7):
             errmsg = 'image "spam" doesn\'t exist'
         else:
             errmsg = 'image "spam" does not exist'
@@ -1192,7 +1192,7 @@ def test_traversal(self):
         elif sys.platform == 'win32':
             focus_identify_as = 'focus'
         else:
-            focus_identify_as = 'focus' if tk_version < (9,0) else 'padding'
+            focus_identify_as = 'focus' if tk_version < (8, 7) else 'padding'
         self.assertEqual(self.nb.identify(5, 5), focus_identify_as)
         simulate_mouse_click(self.nb, 5, 5)
         self.nb.focus_force()

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to