https://github.com/python/cpython/commit/7e30c9ebb913c84eb8d61b5519ec7828869d5ec8
commit: 7e30c9ebb913c84eb8d61b5519ec7828869d5ec8
branch: 3.14
author: Miss Islington (bot) <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-06-25T15:10:52+03:00
summary:

[3.14] gh-151678: Add tests for ttk Menubutton and OptionMenu widget options 
(GH-151960) (GH-151964)

Decorate ttk.MenubuttonTest with add_configure_tests() and make
ttk.OptionMenuTest inherit it to cover the standard widget options.
(cherry picked from commit ce147129c183b934800b539c9a85b7d6bf44ae5d)

Co-authored-by: Serhiy Storchaka <[email protected]>

files:
M Lib/test/test_ttk/test_extensions.py
M Lib/test/test_ttk/test_widgets.py

diff --git a/Lib/test/test_ttk/test_extensions.py 
b/Lib/test/test_ttk/test_extensions.py
index 2765b226e271f9e..0460f1b9aa31172 100644
--- a/Lib/test/test_ttk/test_extensions.py
+++ b/Lib/test/test_ttk/test_extensions.py
@@ -4,10 +4,14 @@
 from tkinter import ttk
 from test.support import requires, gc_collect
 from test.test_tkinter.support import setUpModule  # noqa: F401
-from test.test_tkinter.support import AbstractTkTest, AbstractDefaultRootTest
+from test.test_tkinter.support import (AbstractTkTest, AbstractDefaultRootTest,
+                                       get_tk_patchlevel, widget_eq)
 
 requires('gui')
 
+from test.test_ttk import test_widgets
+
+
 class LabeledScaleTest(AbstractTkTest, unittest.TestCase):
 
     def tearDown(self):
@@ -193,7 +197,7 @@ def test_resize(self):
         x.destroy()
 
 
-class OptionMenuTest(AbstractTkTest, unittest.TestCase):
+class OptionMenuTest(test_widgets.MenubuttonTest, unittest.TestCase):
 
     def setUp(self):
         super().setUp()
@@ -203,6 +207,47 @@ def tearDown(self):
         del self.textvar
         super().tearDown()
 
+    def create(self, default='b', values=('a', 'b', 'c'), **kwargs):
+        return ttk.OptionMenu(self.root, self.textvar, default, *values, 
**kwargs)
+
+    def test_bad_kwarg(self):
+        with self.assertRaisesRegex(tkinter.TclError, r"^unknown option 
-image$"):
+            ttk.OptionMenu(self.root, self.textvar, 'b', image='')
+
+    def test_configure_class(self):
+        # Unlike a plain Menubutton, OptionMenu does not accept a class at
+        # construction, so only the read-only nature of the option is tested.
+        widget = self.create()
+        self.assertEqual(widget['class'], '')
+        errmsg = 'attempt to change read-only option'
+        if get_tk_patchlevel(self.root) < (8, 6, 0, 'beta', 3):
+            errmsg = 'Attempt to change read-only option'
+        self.checkInvalidParam(widget, 'class', 'Foo', errmsg=errmsg)
+
+    def test_configure_style(self):
+        # Like Menubutton, but OptionMenu does not accept a class at
+        # construction, so the custom-class part of the standard test is 
omitted.
+        widget = self.create()
+        self.assertEqual(widget['style'], '')
+        self.checkInvalidParam(widget, 'style', 'Foo',
+                               errmsg='Layout Foo not found')
+        style = ttk.Style(self.root)
+        style.configure('Custom.TMenubutton')
+        self.checkParam(widget, 'style', 'Custom.TMenubutton')
+
+    def test_configure_menu(self):
+        # OptionMenu manages its own menu; ['menu'] returns that Menu widget.
+        widget = self.create()
+        self.assertIsInstance(widget['menu'], tkinter.Menu)
+        self.checkParam(widget, 'menu', widget['menu'], eq=widget_eq)
+
+    def test_configure_text(self):
+        # The displayed text is governed by the textvariable.
+        widget = self.create()
+        self.textvar.set('a')
+        self.assertEqual(widget['text'], 'a')
+        self.textvar.set('c')
+        self.assertEqual(widget['text'], 'c')
 
     def test_widget_destroy(self):
         var = tkinter.StringVar(self.root)
diff --git a/Lib/test/test_ttk/test_widgets.py 
b/Lib/test/test_ttk/test_widgets.py
index a3b3c88b46edd2b..aef15a7137a06ef 100644
--- a/Lib/test/test_ttk/test_widgets.py
+++ b/Lib/test/test_ttk/test_widgets.py
@@ -789,6 +789,7 @@ def cb_test():
         self.assertEqual(str(cbtn['variable']), str(cbtn2['variable']))
 
 
+@add_configure_tests(StandardTtkOptionsTests)
 class MenubuttonTest(AbstractLabelTest, unittest.TestCase):
     OPTIONS = (
         'class', 'compound', 'cursor', 'direction',

_______________________________________________
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