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
3 changes: 3 additions & 0 deletions Lib/test/test_tkinter/test_geometry_managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
class PackTest(AbstractWidgetTest, unittest.TestCase):

test_keys = None
test_options_in_docstring = None

def create2(self):
pack = tkinter.Toplevel(self.root, name='pack')
Expand Down Expand Up @@ -302,6 +303,7 @@ def test_pack_short_aliases(self):
class PlaceTest(AbstractWidgetTest, unittest.TestCase):

test_keys = None
test_options_in_docstring = None

def create2(self):
t = tkinter.Toplevel(self.root, width=300, height=200, bd=0)
Expand Down Expand Up @@ -518,6 +520,7 @@ def test_place_method_aliases(self):
class GridTest(AbstractWidgetTest, unittest.TestCase):

test_keys = None
test_options_in_docstring = None

def tearDown(self):
cols, rows = self.root.grid_size()
Expand Down
56 changes: 45 additions & 11 deletions Lib/test/test_tkinter/widget_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,19 @@

_sentinel = object()

# Abbreviated option names accepted by Tk in addition to the full names.
_OPTION_ALIASES = {
'bd': 'borderwidth',
'bg': 'background',
'bgimg': 'backgroundimage',
'fg': 'foreground',
'invcmd': 'invalidcommand',
'vcmd': 'validatecommand',
}

# Options which accept all values allowed by Tk_GetPixels
# borderwidth = bd

class AbstractWidgetTest(AbstractTkTest):
_default_pixels = '' if tk_version >= (9, 0) else -1 if tk_version >= (8, 7) else ''
_conv_pixels = round
Expand Down Expand Up @@ -198,23 +211,44 @@ def test_keys(self):
widget[k]
# Test if OPTIONS contains all keys
if test.support.verbose:
aliases = {
'bd': 'borderwidth',
'bg': 'background',
'bgimg': 'backgroundimage',
'fg': 'foreground',
'invcmd': 'invalidcommand',
'vcmd': 'validatecommand',
}
keys = set(keys)
expected = set(self.OPTIONS)
for k in sorted(keys - expected):
if not (k in aliases and
aliases[k] in keys and
aliases[k] in expected):
if not (k in _OPTION_ALIASES and
_OPTION_ALIASES[k] in keys and
_OPTION_ALIASES[k] in expected):
print('%s.OPTIONS doesn\'t contain "%s"' %
(self.__class__.__name__, k))

def test_options_in_docstring(self):
# Every option in OPTIONS must be listed in the docstring of the
# __init__ method (see gh-78335). Options reported by keys() but
# missing from the docstring are only printed in verbose mode, as
# some of them depend on the Tk version.
widget = self.create()
doc = type(widget).__init__.__doc__
if doc is None:
self.skipTest('docstrings are not available (run with -OO)')
# Look at the option list only, not the leading description.
start = doc.find('Valid option names')
if start < 0:
start = doc.find('OPTIONS')
if start < 0:
self.skipTest('the __init__ docstring does not list options')
documented = set(re.findall(r'[a-z][a-z0-9]+', doc[start:]))
def is_documented(option):
return (option in documented or
_OPTION_ALIASES.get(option) in documented)
missing = sorted(o for o in self.OPTIONS if not is_documented(o))
self.assertEqual(missing, [],
'%s options missing from the __init__ docstring: %s'
% (type(widget).__name__, missing))
if test.support.verbose:
for key in sorted(set(widget.keys())):
if not is_documented(key):
print('%s.__init__ docstring doesn\'t contain "%s"'
% (type(widget).__name__, key))


class StandardOptionsTests:
STANDARD_OPTIONS = (
Expand Down
4 changes: 4 additions & 0 deletions Lib/test/test_ttk/test_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,10 @@ def test_resize(self):

class OptionMenuTest(test_widgets.MenubuttonTest, unittest.TestCase):

# OptionMenu documents only its own options, not the inherited
# Menubutton options (like the classic tkinter.OptionMenu).
test_options_in_docstring = None

def setUp(self):
super().setUp()
self.textvar = tkinter.StringVar(self.root)
Expand Down
112 changes: 72 additions & 40 deletions Lib/tkinter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2841,10 +2841,11 @@ class Toplevel(BaseWidget, Wm):
def __init__(self, master=None, cnf={}, **kw):
"""Construct a toplevel widget with the parent MASTER.

Valid option names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, menu, relief, screen, takefocus,
use, visual, width."""
Valid option names: background, backgroundimage (Tk 9.0+), bd, bg,
bgimg (Tk 9.0+), borderwidth, class, colormap, container,
cursor, height, highlightbackground, highlightcolor,
highlightthickness, menu, padx, pady, relief, screen,
takefocus, tile (Tk 9.0+), use, visual, width."""
if kw:
cnf = _cnfmerge((cnf, kw))
extra = ()
Expand Down Expand Up @@ -3227,12 +3228,13 @@ def __init__(self, master=None, cnf={}, **kw):
"""Construct a checkbutton widget with the parent MASTER.

Valid option names: activebackground, activeforeground, anchor,
background, bd, bg, bitmap, borderwidth, command, cursor,
disabledforeground, fg, font, foreground, height,
highlightbackground, highlightcolor, highlightthickness, image,
indicatoron, justify, offvalue, onvalue, padx, pady, relief,
selectcolor, selectimage, state, takefocus, text, textvariable,
underline, variable, width, wraplength."""
background, bd, bg, bitmap, borderwidth, command, compound,
cursor, disabledforeground, fg, font, foreground, height,
highlightbackground, highlightcolor, highlightthickness,
image, indicatoron, justify, offrelief, offvalue, onvalue,
overrelief, padx, pady, relief, selectcolor, selectimage,
state, takefocus, text, textvariable, tristateimage,
tristatevalue, underline, variable, width, wraplength."""
Widget.__init__(self, master, 'checkbutton', cnf, kw)

def _setup(self, master, cnf):
Expand Down Expand Up @@ -3276,13 +3278,15 @@ def __init__(self, master=None, cnf={}, **kw):
"""Construct an entry widget with the parent MASTER.

Valid option names: background, bd, bg, borderwidth, cursor,
exportselection, fg, font, foreground, highlightbackground,
highlightcolor, highlightthickness, insertbackground,
insertborderwidth, insertofftime, insertontime, insertwidth,
invalidcommand, invcmd, justify, relief, selectbackground,
selectborderwidth, selectforeground, show, state, takefocus,
textvariable, validate, validatecommand, vcmd, width,
xscrollcommand."""
disabledbackground, disabledforeground, exportselection, fg,
font, foreground, highlightbackground, highlightcolor,
highlightthickness, insertbackground, insertborderwidth,
insertofftime, insertontime, insertwidth, invalidcommand,
invcmd, justify, locale (Tk 9.1+), placeholder (Tk 9.0+),
placeholderforeground (Tk 9.0+), readonlybackground, relief,
selectbackground, selectborderwidth, selectforeground, show,
state, takefocus, textvariable, validate, validatecommand,
vcmd, width, xscrollcommand."""
Widget.__init__(self, master, 'entry', cnf, kw)

def delete(self, first, last=None):
Expand Down Expand Up @@ -3361,9 +3365,11 @@ class Frame(Widget):
def __init__(self, master=None, cnf={}, **kw):
"""Construct a frame widget with the parent MASTER.

Valid option names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width."""
Valid option names: background, backgroundimage (Tk 9.0+), bd, bg,
bgimg (Tk 9.0+), borderwidth, class, colormap, container,
cursor, height, highlightbackground, highlightcolor,
highlightthickness, padx, pady, relief, takefocus, tile (Tk
9.0+), visual, width."""
cnf = _cnfmerge((cnf, kw))
extra = ()
if 'class_' in cnf:
Expand Down Expand Up @@ -3393,7 +3399,8 @@ def __init__(self, master=None, cnf={}, **kw):

WIDGET-SPECIFIC OPTIONS

height, state, width
compound, height, state,
textangle (Tk 9.1+), width

"""
Widget.__init__(self, master, 'label', cnf, kw)
Expand All @@ -3405,11 +3412,14 @@ class Listbox(Widget, XView, YView):
def __init__(self, master=None, cnf={}, **kw):
"""Construct a listbox widget with the parent MASTER.

Valid option names: background, bd, bg, borderwidth, cursor,
exportselection, fg, font, foreground, height, highlightbackground,
highlightcolor, highlightthickness, relief, selectbackground,
selectborderwidth, selectforeground, selectmode, setgrid, takefocus,
width, xscrollcommand, yscrollcommand, listvariable."""
Valid option names: activestyle, background, bd, bg, borderwidth,
cursor, disabledforeground, exportselection, fg, font,
foreground, height, highlightbackground, highlightcolor,
highlightthickness, inactiveselectbackground (Tk 9.1+),
inactiveselectforeground (Tk 9.1+), justify, listvariable,
relief, selectbackground, selectborderwidth, selectforeground,
selectmode, setgrid, state, takefocus, width, xscrollcommand,
yscrollcommand."""
Widget.__init__(self, master, 'listbox', cnf, kw)

def activate(self, index):
Expand Down Expand Up @@ -3519,7 +3529,8 @@ def __init__(self, master=None, cnf={}, **kw):
"""Construct menu widget with the parent MASTER.

Valid option names: activebackground, activeborderwidth,
activeforeground, background, bd, bg, borderwidth, cursor,
activeforeground, activerelief (Tk 9.0+), background, bd, bg,
borderwidth, cursor,
disabledforeground, fg, font, foreground, postcommand, relief,
selectcolor, takefocus, tearoff, tearoffcommand, title, type."""
Widget.__init__(self, master, 'menu', cnf, kw)
Expand Down Expand Up @@ -3649,13 +3660,27 @@ class Menubutton(Widget):
"""Menubutton widget, obsolete since Tk8.0."""

def __init__(self, master=None, cnf={}, **kw):
"""Construct a menubutton widget with the parent MASTER.

Valid option names: activebackground, activeforeground, anchor,
background, bd, bg, bitmap, borderwidth, compound, cursor,
direction, disabledforeground, fg, font, foreground, height,
highlightbackground, highlightcolor, highlightthickness,
image, indicatoron, justify, menu, padx, pady, relief, state,
takefocus, text, textvariable, underline, width, wraplength."""
Widget.__init__(self, master, 'menubutton', cnf, kw)


class Message(Widget):
"""Message widget to display multiline text. Obsolete since Label does it too."""

def __init__(self, master=None, cnf={}, **kw):
"""Construct a message widget with the parent MASTER.

Valid option names: anchor, aspect, background, bd, bg, borderwidth,
cursor, fg, font, foreground, highlightbackground,
highlightcolor, highlightthickness, justify, padx, pady,
relief, takefocus, text, textvariable, width."""
Widget.__init__(self, master, 'message', cnf, kw)


Expand All @@ -3666,12 +3691,13 @@ def __init__(self, master=None, cnf={}, **kw):
"""Construct a radiobutton widget with the parent MASTER.

Valid option names: activebackground, activeforeground, anchor,
background, bd, bg, bitmap, borderwidth, command, cursor,
disabledforeground, fg, font, foreground, height,
highlightbackground, highlightcolor, highlightthickness, image,
indicatoron, justify, padx, pady, relief, selectcolor, selectimage,
state, takefocus, text, textvariable, underline, value, variable,
width, wraplength."""
background, bd, bg, bitmap, borderwidth, command, compound,
cursor, disabledforeground, fg, font, foreground, height,
highlightbackground, highlightcolor, highlightthickness,
image, indicatoron, justify, offrelief, overrelief, padx,
pady, relief, selectcolor, selectimage, state, takefocus,
text, textvariable, tristateimage, tristatevalue, underline,
value, variable, width, wraplength."""
Widget.__init__(self, master, 'radiobutton', cnf, kw)

def deselect(self):
Expand Down Expand Up @@ -3802,9 +3828,11 @@ def __init__(self, master=None, cnf={}, **kw):

WIDGET-SPECIFIC OPTIONS

autoseparators, height, maxundo,
spacing1, spacing2, spacing3,
state, tabs, undo, width, wrap,
autoseparators, blockcursor, endline,
height, inactiveselectbackground,
insertunfocussed, locale (Tk 9.1+), maxundo,
spacing1, spacing2, spacing3, startline,
state, tabs, tabstyle, undo, width, wrap,

"""
Widget.__init__(self, master, 'text', cnf, kw)
Expand Down Expand Up @@ -4632,9 +4660,12 @@ def __init__(self, master=None, cnf={}, **kw):
buttondownrelief, buttonuprelief,
command, disabledbackground,
disabledforeground, format, from,
invalidcommand, increment,
invalidcommand, invcmd, increment,
locale (Tk 9.1+),
placeholder (Tk 9.0+),
placeholderforeground (Tk 9.0+),
readonlybackground, state, to,
validate, validatecommand values,
validate, validatecommand, vcmd, values,
width, wrap,
"""
Widget.__init__(self, master, 'spinbox', cnf, kw)
Expand Down Expand Up @@ -4823,8 +4854,9 @@ def __init__(self, master=None, cnf={}, **kw):
WIDGET-SPECIFIC OPTIONS

handlepad, handlesize, opaqueresize,
sashcursor, sashpad, sashrelief,
sashwidth, showhandle,
proxybackground, proxyborderwidth,
proxyrelief, sashcursor, sashpad,
sashrelief, sashwidth, showhandle,
"""
Widget.__init__(self, master, 'panedwindow', cnf, kw)

Expand Down
Loading
Loading