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

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

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2026-06-25 18:58:14 +02:00 committed by GitHub
parent 704c4c79e8
commit 640c5f4a97
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 48 additions and 2 deletions

View file

@ -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)

View file

@ -768,6 +768,7 @@ def cb_test():
self.assertEqual(str(cbtn['variable']), str(cbtn2['variable']))
@add_standard_options(StandardTtkOptionsTests)
class MenubuttonTest(AbstractLabelTest, unittest.TestCase):
OPTIONS = (
'class', 'compound', 'cursor', 'direction',