From b50306d437755d7174c81c46aedbcbe12303acd0 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 9 Jul 2026 09:07:34 +0300 Subject: [PATCH] gh-153380: Adapt ttk tests to Tk 9.1 changes (GH-153381) - selectmode: new 'single' and 'multiple' modes - set(): includes the tree column '#0' - insert()/selection(): item ids keep the passed value's type - heading_callback: avoid a double click on the second click - theme_create_image: don't assert the exact (now scaled) width (cherry picked from commit d6855c8ad00ffa2bee318b510d0e90573dddbbab) Co-authored-by: Serhiy Storchaka Co-authored-by: Claude Opus 4.8 --- Lib/test/test_ttk/test_style.py | 3 ++- Lib/test/test_ttk/test_widgets.py | 35 ++++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_ttk/test_style.py b/Lib/test/test_ttk/test_style.py index f85f76eb499278..56d8a5931fdfa5 100644 --- a/Lib/test/test_ttk/test_style.py +++ b/Lib/test/test_ttk/test_style.py @@ -420,7 +420,8 @@ def test_theme_create_image(self): b = ttk.Label(self.root, style='TestWidget') b.pack(expand=True, fill='both') - self.assertEqual(b.winfo_reqwidth(), 134) + # The exact width varies with the Tk version and display scaling. + self.assertGreater(b.winfo_reqwidth(), 130) self.assertEqual(b.winfo_reqheight(), 100) style.theme_use(curr_theme) diff --git a/Lib/test/test_ttk/test_widgets.py b/Lib/test/test_ttk/test_widgets.py index 5b1000b699e4b0..b2cc7f16f89446 100644 --- a/Lib/test/test_ttk/test_widgets.py +++ b/Lib/test/test_ttk/test_widgets.py @@ -1500,8 +1500,13 @@ def test_configure_height(self): def test_configure_selectmode(self): widget = self.create() - self.checkEnumParam(widget, 'selectmode', - 'none', 'browse', 'extended') + if tk_version >= (9, 1): + self.checkEnumParam(widget, 'selectmode', + 'none', 'single', 'browse', 'extended', + 'multiple') + else: + self.checkEnumParam(widget, 'selectmode', + 'none', 'browse', 'extended') @requires_tk(8, 7) def test_configure_selecttype(self): @@ -1784,6 +1789,9 @@ def simulate_heading_click(x, y): commands = self.tv.master._tclCommands self.tv.heading('#0', command=str(self.tv.heading('#0', command=None))) self.assertEqual(commands, self.tv.master._tclCommands) + # Click elsewhere first, so the second heading click is not reported + # as a double click (which does not invoke the command). + simulate_mouse_click(self.tv, 5, 50) simulate_heading_click(5, 5) if not success: self.fail("The command associated to the treeview heading wasn't " @@ -1892,10 +1900,11 @@ def test_insert_item(self): value) # test for values which are not None + keep_type = self.wantobjects and tk_version >= (9, 1) itemid = self.tv.insert('', 'end', 0) - self.assertEqual(itemid, '0') + self.assertEqual(itemid, 0 if keep_type else '0') itemid = self.tv.insert('', 'end', 0.0) - self.assertEqual(itemid, '0.0') + self.assertEqual(itemid, 0.0 if keep_type else '0.0') # this is because False resolves to 0 and element with 0 iid is already present self.assertRaises(tkinter.TclError, self.tv.insert, '', 'end', False) self.assertRaises(tkinter.TclError, self.tv.insert, '', 'end', '') @@ -1955,7 +1964,10 @@ def test_selection(self): self.tv.insert('', 'end', id=b'bytes\xe2\x82\xac') self.tv.selection_set(b'bytes\xe2\x82\xac') - self.assertEqual(self.tv.selection(), ('bytes\xe2\x82\xac',)) + self.assertEqual(self.tv.selection(), + (b'bytes\xe2\x82\xac',) + if self.wantobjects and tk_version >= (9, 1) + else ('bytes\xe2\x82\xac',)) self.tv.selection_set() self.assertEqual(self.tv.selection(), ()) @@ -2004,14 +2016,19 @@ def test_virtual_events(self): def test_set(self): self.tv['columns'] = ['A', 'B'] item = self.tv.insert('', 'end', values=['a', 'b']) - self.assertEqual(self.tv.set(item), {'A': 'a', 'B': 'b'}) + values = self.tv.set(item) + if tk_version >= (9, 1): + self.assertEqual(values.pop('#0'), '') + self.assertEqual(values, {'A': 'a', 'B': 'b'}) self.tv.set(item, 'B', 'a') self.assertEqual(self.tv.item(item, values=None), ('a', 'a') if self.wantobjects else 'a a') self.tv['columns'] = ['B'] - self.assertEqual(self.tv.set(item), {'B': 'a'}) + values = self.tv.set(item) + values.pop('#0', None) + self.assertEqual(values, {'B': 'a'}) self.tv.set(item, 'B', 'b') self.assertEqual(self.tv.set(item, column='B'), 'b') @@ -2023,7 +2040,9 @@ def test_set(self): 123 if self.wantobjects else '123') self.assertEqual(self.tv.item(item, values=None), (123, 'a') if self.wantobjects else '123 a') - self.assertEqual(self.tv.set(item), + values = self.tv.set(item) + values.pop('#0', None) + self.assertEqual(values, {'B': 123} if self.wantobjects else {'B': '123'}) # inexistent column