Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 47 additions & 2 deletions Lib/test/test_ttk/test_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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()
Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions Lib/test/test_ttk/test_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
Loading