gh-75666: Tkinter: "unbind(sequence, funcid)" now only unbinds "funcid" (GH-111322)

Previously, "widget.unbind(sequence, funcid)" destroyed the current binding
for "sequence", leaving "sequence" unbound, and deleted the "funcid"
command.

Now it removes only "funcid" from the binding for "sequence", keeping
other commands, and deletes the "funcid" command.
It leaves "sequence" unbound only if "funcid" was the last bound command.

Co-authored-by: GiovanniL <13402461+GiovaLomba@users.noreply.github.com>
This commit is contained in:
Serhiy Storchaka 2023-12-06 16:42:15 +02:00 committed by GitHub
parent 828451dfde
commit cc7e45cc57
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 52 additions and 12 deletions

View file

@ -1527,10 +1527,24 @@ class Misc:
return self._bind(('bind', self._w), sequence, func, add)
def unbind(self, sequence, funcid=None):
"""Unbind for this widget for event SEQUENCE the
function identified with FUNCID."""
self.tk.call('bind', self._w, sequence, '')
if funcid:
"""Unbind for this widget the event SEQUENCE.
If FUNCID is given, only unbind the function identified with FUNCID
and also delete the corresponding Tcl command.
Otherwise destroy the current binding for SEQUENCE, leaving SEQUENCE
unbound.
"""
if funcid is None:
self.tk.call('bind', self._w, sequence, '')
else:
lines = self.tk.call('bind', self._w, sequence).split('\n')
prefix = f'if {{"[{funcid} '
keep = '\n'.join(line for line in lines
if not line.startswith(prefix))
if not keep.strip():
keep = ''
self.tk.call('bind', self._w, sequence, keep)
self.deletecommand(funcid)
def bind_all(self, sequence=None, func=None, add=None):