Skip to content
Open
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
14 changes: 14 additions & 0 deletions Doc/library/tkinter.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5475,6 +5475,20 @@ Widget classes
inserted or deleted.
Otherwise set the flag to the boolean *arg*.

.. method:: edit_canundo()

Return ``True`` if there is an edit action on the undo stack that can be
undone, and ``False`` otherwise.

.. versionadded:: next

.. method:: edit_canredo()

Return ``True`` if there is an edit action on the redo stack that can be
reapplied, and ``False`` otherwise.

.. versionadded:: next

.. method:: edit_undo()

Undo the most recent edit action, that is, all the inserts and deletes
Expand Down
8 changes: 8 additions & 0 deletions Doc/whatsnew/3.16.rst
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,14 @@ shlex
a string, even if it is already safe for a shell without being quoted.
(Contributed by Jay Berry in :gh:`148846`.)

tkinter
-------

* Added new :class:`!tkinter.Text` methods :meth:`~tkinter.Text.edit_canundo`
and :meth:`~tkinter.Text.edit_canredo` which return whether an undo or redo
is possible.
(Contributed by Serhiy Storchaka in :gh:`151674`.)

xml
---

Expand Down
23 changes: 23 additions & 0 deletions Lib/test/test_tkinter/test_text.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,29 @@ def test_debug(self):
text.debug(olddebug)
self.assertEqual(text.debug(), olddebug)

def test_edit_undo_redo(self):
text = self.text
text.configure(undo=True)

self.assertIs(text.edit_canundo(), False)
self.assertIs(text.edit_canredo(), False)

text.insert('1.0', 'spam')
self.assertIs(text.edit_canundo(), True)
self.assertIs(text.edit_canredo(), False)

text.edit_undo()
self.assertIs(text.edit_canundo(), False)
self.assertIs(text.edit_canredo(), True)

text.edit_redo()
self.assertIs(text.edit_canundo(), True)
self.assertIs(text.edit_canredo(), False)

text.edit_reset()
self.assertIs(text.edit_canundo(), False)
self.assertIs(text.edit_canredo(), False)

def test_search(self):
text = self.text

Expand Down
16 changes: 16 additions & 0 deletions Lib/tkinter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3970,6 +3970,22 @@ def edit(self, *args):
"""
return self.tk.call(self._w, 'edit', *args)

def edit_canredo(self):
"""Return whether redo is possible.

Return True if redo is possible, i.e. when the redo stack is
not empty, and False otherwise.
"""
return self.tk.getboolean(self.edit("canredo"))

def edit_canundo(self):
"""Return whether undo is possible.

Return True if undo is possible, i.e. when the undo stack is
not empty, and False otherwise.
"""
return self.tk.getboolean(self.edit("canundo"))

def edit_modified(self, arg=None):
"""Get or Set the modified flag

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Add the :meth:`~tkinter.Text.edit_canundo` and :meth:`~tkinter.Text.edit_canredo`
methods of :class:`!tkinter.Text`, wrapping the Tk ``edit canundo`` and
``edit canredo`` subcommands.
Loading