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
23 changes: 23 additions & 0 deletions Doc/library/tkinter.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5594,6 +5594,29 @@ Widget classes

.. versionadded:: 3.3

.. method:: sync(command=None)

Control the synchronization of the displayed view with the underlying
text, which may lag behind when line heights have not yet been computed
(for example, for lines that have never been displayed).
If *command* is omitted, bring the line metrics up to date immediately by
forcing computation of any outdated line heights, and return once they
are current.
Otherwise schedule *command* to be called, with no arguments, exactly
once as soon as all line heights are up to date; if there are no pending
calculations, it is called immediately.

.. versionadded:: next

.. method:: pendingsync()

Return ``True`` if the line height calculations are not up to date, and
``False`` otherwise.
The ``<<WidgetViewSync>>`` virtual event fires whenever this state
changes, with the *detail* field set to the new value.

.. versionadded:: next

.. method:: yview_pickplace(*what)

Adjust the view so that the location given by *what* is visible.
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 @@ -144,6 +144,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.sync` and
:meth:`~tkinter.Text.pendingsync` which control and report the
synchronization of the displayed view with the underlying text.
(Contributed by Serhiy Storchaka in :gh:`151675`.)

xml
---

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

def test_sync(self):
text = self.text
# sync() returns None and brings line metrics up to date.
self.assertIsNone(text.sync())
self.assertIs(text.pendingsync(), False)

# sync(command) schedules a one-shot callback.
events = []
text.sync(command=lambda: events.append('synced'))
text.update()
self.assertEqual(events, ['synced'])

def test_index(self):
text = self.text
text.insert('1.0', 'Lorem ipsum\ndolor sit amet')
Expand Down
38 changes: 38 additions & 0 deletions Lib/tkinter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4094,6 +4094,44 @@ def peer_names(self): # new in Tk 8.5
the widget itself)."""
return self.tk.splitlist(self.tk.call(self._w, 'peer', 'names'))

def pendingsync(self): # new in Tk 8.5
"""Return whether the line heights calculations are not up-to-date.
Return True if the line heights calculations are not up-to-date,
and False otherwise.
"""
return self.tk.getboolean(self.tk.call(self._w, 'pendingsync'))

def sync(self, command=None): # new in Tk 8.5
"""Control the synchronization of the view of the text widget.
If command is not specified, immediately bring the line metrics
up-to-date by forcing computation of any outdated line heights.
The command returns immediately if there is no such outdated line.
If command is specified, schedule it to be executed (by the event
loop) exactly once as soon as all line heights are up-to-date.
If there are no pending line metrics calculations, command is
executed immediately.
"""
if command is None:
self.tk.call(self._w, 'sync')
else:
def callit():
try:
command()
finally:
try:
self.deletecommand(name)
except TclError:
pass
try:
callit.__name__ = command.__name__
except AttributeError:
callit.__name__ = type(command).__name__
name = self._register(callit)
self.tk.call(self._w, 'sync', '-command', name)

def replace(self, index1, index2, chars, *args): # new in Tk 8.5
"""Replaces the range of characters between index1 and index2 with
the given characters and tags specified by args.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Add the :meth:`~tkinter.Text.sync` and :meth:`~tkinter.Text.pendingsync`
methods of :class:`!tkinter.Text`, wrapping the Tk ``sync`` and
``pendingsync`` subcommands.
Loading