Typically associated with mouse motion events, to produce the effect of
dragging the entry at high speed through the window.
+ .. method:: validate()
+
+ Force an evaluation of the command given by the *validatecommand* option,
+ independently of the conditions specified by the *validate* option, and
+ return whether the value is considered valid.
+
+ .. versionadded:: next
+
.. class:: Frame(master=None, cnf={}, **kw)
.. versionadded:: 3.8
+ .. method:: validate()
+
+ Force an evaluation of the command given by the *validatecommand* option,
+ independently of the conditions specified by the *validate* option, and
+ return whether the value is considered valid.
+
+ .. versionadded:: next
+
.. class:: Text(master=None, cnf={}, **kw)
synchronization of the displayed view with the underlying text.
(Contributed by Serhiy Storchaka in :gh:`151675`.)
+* Added a :meth:`!validate` method to the :class:`!tkinter.Entry` and
+ :class:`!tkinter.Spinbox` widgets, which forces an evaluation of the
+ validation command.
+ (Contributed by Serhiy Storchaka in :gh:`151878`.)
+
* Added new window-management methods :meth:`~tkinter.Misc.winfo_isdark`
(dark mode detection), :meth:`~tkinter.Wm.wm_iconbadge` (application icon
badge) and :meth:`~tkinter.Wm.wm_stackorder` (toplevel stacking order).
self.assertRaisesRegex(TclError, 'bad entry index "xyz"',
widget.select_range, 'xyz', 'end')
+ def test_validate(self):
+ calls = []
+ def validatecommand(value):
+ calls.append(value)
+ return value.isdigit()
+ # validate='none' means validation is never triggered automatically,
+ # so validate() exercises the forced evaluation.
+ widget = self.create(validate='none',
+ validatecommand=(self.root.register(validatecommand), '%P'))
+ widget.insert(0, '123')
+ result = widget.validate()
+ self.assertIs(result, True)
+ self.assertEqual(calls, ['123'])
+ widget.delete(0, 'end')
+ widget.insert(0, 'abc')
+ calls.clear()
+ self.assertIs(widget.validate(), False)
+ self.assertEqual(calls, ['abc'])
+
@add_configure_tests(StandardOptionsTests)
class SpinboxTest(EntryTest, unittest.TestCase):
select_to = selection_to
+ def validate(self):
+ """Force an evaluation of the validation command.
+
+ This evaluates the command given by the validatecommand option,
+ independently of the conditions specified by the validate option.
+ Return whether the value is considered valid."""
+ return self.tk.getboolean(self.tk.call(self._w, 'validate'))
+
class Frame(Widget):
"""Frame widget which may contain other widgets and can have a 3D border."""
"""Set the variable end of a selection to INDEX."""
self.selection('to', index)
+ def validate(self):
+ """Force an evaluation of the validation command.
+
+ This evaluates the command given by the validatecommand option,
+ independently of the conditions specified by the validate option.
+ Return whether the value is considered valid."""
+ return self.tk.getboolean(self.tk.call(self._w, 'validate'))
+
###########################################################################
--- /dev/null
+Add the :meth:`!validate` method to the :class:`tkinter.Entry` and
+:class:`tkinter.Spinbox` widgets, forcing an evaluation of the validation
+command.