summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_ttk
diff options
context:
space:
mode:
authorMarc Culler <culler@users.noreply.github.com>2024-11-14 18:45:08 (GMT)
committerGitHub <noreply@github.com>2024-11-14 18:45:08 (GMT)
commit47cbf038850852cdcbe7a404ed7c64542340d58a (patch)
treeca977544f84a311c43120280e1ae564f67b51728 /Lib/test/test_ttk
parent1e3497e745d6559d30dbb65c914d19c759d60dc5 (diff)
downloadcpython-47cbf038850852cdcbe7a404ed7c64542340d58a.zip
cpython-47cbf038850852cdcbe7a404ed7c64542340d58a.tar.gz
cpython-47cbf038850852cdcbe7a404ed7c64542340d58a.tar.bz2
gh-124111: Update tkinter for compatibility with Tcl/Tk 9.0.0 (GH-124156)
Diffstat (limited to 'Lib/test/test_ttk')
-rw-r--r--Lib/test/test_ttk/test_style.py3
-rw-r--r--Lib/test/test_ttk/test_widgets.py105
2 files changed, 74 insertions, 34 deletions
diff --git a/Lib/test/test_ttk/test_style.py b/Lib/test/test_ttk/test_style.py
index eeaf5de..1991877 100644
--- a/Lib/test/test_ttk/test_style.py
+++ b/Lib/test/test_ttk/test_style.py
@@ -205,7 +205,8 @@ class StyleTest(AbstractTkTest, unittest.TestCase):
style = self.style
with self.assertRaises(IndexError):
style.element_create('plain.newelem', 'from')
- with self.assertRaisesRegex(TclError, 'theme "spam" doesn\'t exist'):
+ with self.assertRaisesRegex(TclError,
+ 'theme "spam" (does not|doesn\'t) exist'):
style.element_create('plain.newelem', 'from', 'spam')
def test_element_create_image(self):
diff --git a/Lib/test/test_ttk/test_widgets.py b/Lib/test/test_ttk/test_widgets.py
index 10bec33..d5620be 100644
--- a/Lib/test/test_ttk/test_widgets.py
+++ b/Lib/test/test_ttk/test_widgets.py
@@ -8,7 +8,7 @@ from test.test_ttk_textonly import MockTclObj
from test.test_tkinter.support import (
AbstractTkTest, requires_tk, tk_version, get_tk_patchlevel,
simulate_mouse_click, AbstractDefaultRootTest)
-from test.test_tkinter.widget_tests import (add_standard_options,
+from test.test_tkinter.widget_tests import (add_configure_tests,
AbstractWidgetTest, StandardOptionsTests, IntegerSizeTests, PixelSizeTests)
requires('gui')
@@ -125,10 +125,11 @@ class WidgetTest(AbstractTkTest, unittest.TestCase):
class AbstractToplevelTest(AbstractWidgetTest, PixelSizeTests):
- _conv_pixels = False
+ _rounds_pixels = False
+ _clipped = {}
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class FrameTest(AbstractToplevelTest, unittest.TestCase):
OPTIONS = (
'borderwidth', 'class', 'cursor', 'height',
@@ -140,7 +141,7 @@ class FrameTest(AbstractToplevelTest, unittest.TestCase):
return ttk.Frame(self.root, **kwargs)
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class LabelFrameTest(AbstractToplevelTest, unittest.TestCase):
OPTIONS = (
'borderwidth', 'class', 'cursor', 'height',
@@ -168,6 +169,8 @@ class LabelFrameTest(AbstractToplevelTest, unittest.TestCase):
class AbstractLabelTest(AbstractWidgetTest):
_allow_empty_justify = True
+ _rounds_pixels = False
+ _clipped = {}
def checkImageParam(self, widget, name):
image = tkinter.PhotoImage(master=self.root, name='image1')
@@ -179,8 +182,11 @@ class AbstractLabelTest(AbstractWidgetTest):
expected=('image1', 'active', 'image2'))
self.checkParam(widget, name, 'image1 active image2',
expected=('image1', 'active', 'image2'))
- self.checkInvalidParam(widget, name, 'spam',
- errmsg='image "spam" doesn\'t exist')
+ if tk_version < (9, 0):
+ errmsg = 'image "spam" doesn\'t exist'
+ else:
+ errmsg = 'image "spam" does not exist'
+ self.checkInvalidParam(widget, name, 'spam', errmsg=errmsg)
def test_configure_compound(self):
values = ('none', 'text', 'image', 'center', 'top', 'bottom', 'left', 'right')
@@ -196,7 +202,7 @@ class AbstractLabelTest(AbstractWidgetTest):
self.checkParams(widget, 'width', 402, -402, 0)
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class LabelTest(AbstractLabelTest, unittest.TestCase):
OPTIONS = (
'anchor', 'background', 'borderwidth',
@@ -214,7 +220,7 @@ class LabelTest(AbstractLabelTest, unittest.TestCase):
test_configure_justify = StandardOptionsTests.test_configure_justify
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class ButtonTest(AbstractLabelTest, unittest.TestCase):
OPTIONS = (
'class', 'command', 'compound', 'cursor', 'default',
@@ -239,7 +245,7 @@ class ButtonTest(AbstractLabelTest, unittest.TestCase):
self.assertTrue(success)
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
OPTIONS = (
'class', 'command', 'compound', 'cursor',
@@ -326,7 +332,7 @@ class CheckbuttonTest(AbstractLabelTest, unittest.TestCase):
self.assertEqual(len(set(variables)), len(buttons), variables)
-@add_standard_options(IntegerSizeTests, StandardTtkOptionsTests)
+@add_configure_tests(IntegerSizeTests, StandardTtkOptionsTests)
class EntryTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'background', 'class', 'cursor',
@@ -336,6 +342,8 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase):
'show', 'state', 'style', 'takefocus', 'textvariable',
'validate', 'validatecommand', 'width', 'xscrollcommand',
)
+ _rounds_pixels = False
+ _clipped = {}
# bpo-27313: macOS Tk/Tcl may or may not report 'Entry.field'.
IDENTIFY_AS = {'Entry.field', 'textarea'}
@@ -371,8 +379,12 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase):
self.assertRaises(tkinter.TclError, self.entry.bbox, None)
def test_identify(self):
+ if (tk_version >= (9, 0) and sys.platform == 'darwin'
+ and isinstance(self.entry, ttk.Combobox)):
+ self.skipTest('Test does not work on macOS Tk 9.')
+ # https://core.tcl-lang.org/tk/tktview/8b49e9cfa6
self.entry.pack()
- self.entry.update()
+ self.root.update()
self.assertIn(self.entry.identify(5, 5), self.IDENTIFY_AS)
self.assertEqual(self.entry.identify(-1, -1), "")
@@ -450,7 +462,7 @@ class EntryTest(AbstractWidgetTest, unittest.TestCase):
self.assertEqual(self.entry.state(), ())
-@add_standard_options(IntegerSizeTests, StandardTtkOptionsTests)
+@add_configure_tests(IntegerSizeTests, StandardTtkOptionsTests)
class ComboboxTest(EntryTest, unittest.TestCase):
OPTIONS = (
'background', 'class', 'cursor', 'exportselection',
@@ -479,11 +491,14 @@ class ComboboxTest(EntryTest, unittest.TestCase):
x, y = width - 5, 5
if sys.platform != 'darwin': # there's no down arrow on macOS
self.assertRegex(self.combo.identify(x, y), r'.*downarrow\Z')
- self.combo.event_generate('<ButtonPress-1>', x=x, y=y)
+ self.combo.event_generate('<Button-1>', x=x, y=y)
self.combo.event_generate('<ButtonRelease-1>', x=x, y=y)
- self.combo.update_idletasks()
def test_virtual_event(self):
+ if (tk_version >= (9, 0) and sys.platform == 'darwin'
+ and isinstance(self.entry, ttk.Combobox)):
+ self.skipTest('Test does not work on macOS Tk 9.')
+ # https://core.tcl-lang.org/tk/tktview/8b49e9cfa6
success = []
self.combo['values'] = [1]
@@ -501,6 +516,10 @@ class ComboboxTest(EntryTest, unittest.TestCase):
self.assertTrue(success)
def test_configure_postcommand(self):
+ if (tk_version >= (9, 0) and sys.platform == 'darwin'
+ and isinstance(self.entry, ttk.Combobox)):
+ self.skipTest('Test does not work on macOS Tk 9.')
+ # https://core.tcl-lang.org/tk/tktview/8b49e9cfa6
success = []
self.combo['postcommand'] = lambda: success.append(True)
@@ -576,12 +595,14 @@ class ComboboxTest(EntryTest, unittest.TestCase):
combo2.destroy()
-@add_standard_options(IntegerSizeTests, StandardTtkOptionsTests)
+@add_configure_tests(IntegerSizeTests, StandardTtkOptionsTests)
class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'class', 'cursor', 'height',
'orient', 'style', 'takefocus', 'width',
)
+ _rounds_pixels = False
+ _clipped = {}
def setUp(self):
super().setUp()
@@ -712,7 +733,7 @@ class PanedWindowTest(AbstractWidgetTest, unittest.TestCase):
self.assertIsInstance(self.paned.sashpos(0), int)
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class RadiobuttonTest(AbstractLabelTest, unittest.TestCase):
OPTIONS = (
'class', 'command', 'compound', 'cursor',
@@ -791,13 +812,14 @@ class MenubuttonTest(AbstractLabelTest, unittest.TestCase):
menu.destroy()
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class ScaleTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'class', 'command', 'cursor', 'from', 'length',
'orient', 'state', 'style', 'takefocus', 'to', 'value', 'variable',
)
- _conv_pixels = False
+ _rounds_pixels = False
+ _clipped = {}
default_orient = 'horizontal'
def setUp(self):
@@ -899,7 +921,7 @@ class ScaleTest(AbstractWidgetTest, unittest.TestCase):
self.assertRaises(tkinter.TclError, self.scale.set, None)
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class ProgressbarTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'anchor', 'class', 'cursor', 'font', 'foreground', 'justify',
@@ -907,7 +929,8 @@ class ProgressbarTest(AbstractWidgetTest, unittest.TestCase):
'mode', 'maximum', 'phase', 'text', 'wraplength',
'style', 'takefocus', 'value', 'variable',
)
- _conv_pixels = False
+ _rounds_pixels = False
+ _clipped = {}
_allow_empty_justify = True
default_orient = 'horizontal'
@@ -952,24 +975,27 @@ class ProgressbarTest(AbstractWidgetTest, unittest.TestCase):
@unittest.skipIf(sys.platform == 'darwin',
'ttk.Scrollbar is special on MacOSX')
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class ScrollbarTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'class', 'command', 'cursor', 'orient', 'style', 'takefocus',
)
+ _rounds_pixels = False
+ _clipped = {}
default_orient = 'vertical'
def create(self, **kwargs):
return ttk.Scrollbar(self.root, **kwargs)
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class NotebookTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'class', 'cursor', 'height', 'padding', 'style', 'takefocus', 'width',
)
- if tk_version >= (8, 7):
- _conv_pixels = False
+ _rounds_pixels = (tk_version < (9,0))
+ _converts_pixels = False
+ _clipped = {}
def setUp(self):
super().setUp()
@@ -987,14 +1013,14 @@ class NotebookTest(AbstractWidgetTest, unittest.TestCase):
if get_tk_patchlevel(self.root) < (8, 6, 15):
self.checkIntegerParam(widget, 'height', 402, -402, 0)
else:
- self.checkPixelsParam(widget, 'height', '10c', 402, -402, 0, conv=False)
+ self.checkPixelsParam(widget, 'height', '10c', 402, -402, 0)
def test_configure_width(self):
widget = self.create()
if get_tk_patchlevel(self.root) < (8, 6, 15):
self.checkIntegerParam(widget, 'width', 402, -402, 0)
else:
- self.checkPixelsParam(widget, 'width', '10c', 402, -402, 0, conv=False)
+ self.checkPixelsParam(widget, 'width', '10c', 402, -402, 0)
def test_tab_identifiers(self):
self.nb.forget(0)
@@ -1160,7 +1186,12 @@ class NotebookTest(AbstractWidgetTest, unittest.TestCase):
self.nb.select(0)
- focus_identify_as = 'focus' if sys.platform != 'darwin' else ''
+ if sys.platform == 'darwin':
+ focus_identify_as = ''
+ elif sys.platform == 'win32':
+ focus_identify_as = 'focus'
+ else:
+ focus_identify_as = 'focus' if tk_version < (9,0) else 'padding'
self.assertEqual(self.nb.identify(5, 5), focus_identify_as)
simulate_mouse_click(self.nb, 5, 5)
self.nb.focus_force()
@@ -1193,7 +1224,7 @@ class NotebookTest(AbstractWidgetTest, unittest.TestCase):
self.assertEqual(self.nb.select(), str(self.child2))
-@add_standard_options(IntegerSizeTests, StandardTtkOptionsTests)
+@add_configure_tests(IntegerSizeTests, StandardTtkOptionsTests)
class SpinboxTest(EntryTest, unittest.TestCase):
OPTIONS = (
'background', 'class', 'command', 'cursor', 'exportselection',
@@ -1370,7 +1401,7 @@ class SpinboxTest(EntryTest, unittest.TestCase):
spin2.destroy()
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class TreeviewTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'class', 'columns', 'cursor', 'displaycolumns',
@@ -1378,6 +1409,8 @@ class TreeviewTest(AbstractWidgetTest, unittest.TestCase):
'style', 'takefocus', 'titlecolumns', 'titleitems',
'xscrollcommand', 'yscrollcommand',
)
+ _rounds_pixels = False
+ _clipped = {}
def setUp(self):
super().setUp()
@@ -1413,8 +1446,10 @@ class TreeviewTest(AbstractWidgetTest, unittest.TestCase):
def test_configure_height(self):
widget = self.create()
- self.checkPixelsParam(widget, 'height', 100, -100, 0, '3c', conv=False)
- self.checkPixelsParam(widget, 'height', 101.2, 102.6, conv=False)
+ self.checkPixelsParam(widget, 'height', 100, -100, 0, '3c',
+ conv=False)
+ self.checkPixelsParam(widget, 'height', 101.2, 102.6, '3c',
+ conv=False)
def test_configure_selectmode(self):
widget = self.create()
@@ -1936,24 +1971,28 @@ class TreeviewTest(AbstractWidgetTest, unittest.TestCase):
self.assertEqual(self.tv.tag_has('tag3'), ())
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class SeparatorTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'class', 'cursor', 'orient', 'style', 'takefocus',
# 'state'?
)
+ _rounds_pixels = False
+ _clipped = {}
default_orient = 'horizontal'
def create(self, **kwargs):
return ttk.Separator(self.root, **kwargs)
-@add_standard_options(StandardTtkOptionsTests)
+@add_configure_tests(StandardTtkOptionsTests)
class SizegripTest(AbstractWidgetTest, unittest.TestCase):
OPTIONS = (
'class', 'cursor', 'style', 'takefocus',
# 'state'?
)
+ _rounds_pixels = False
+ _clipped = {}
def create(self, **kwargs):
return ttk.Sizegrip(self.root, **kwargs)