from __future__ import print_function
import sys
import collections
import functools
_handlers = collections.defaultdict(list)
def _run_handlers(list_of_handlers, event):
exc_info = None
for func in list_of_handlers:
try:
func(event)
except SystemExit:
exc_info = sys.exc_info()
except:
import traceback
print("Error in global_binding._run_handlers:", file=sys.stderr)
traceback.print_exc()
exc_info = sys.exc_info()
if exc_info is not None:
raise exc_info[0], exc_info[1], exc_info[2]
def global_bind(w, event, func, add=None):
root = w.nametowidget(".")
handlers_of_event = _handlers[event]
if len(handlers_of_event) == 0:
root.bind_all(event, functools.partial(_run_handlers, handlers_of_event))
if add == "+":
handlers_of_event.append(func)
else:
handlers_of_event[:] = [func]
return func
def global_unbind(w, event, func):
_handlers[event].remove(func)
if len(_handlers[event]) == 0:
w.unbind_all(event)
if __name__ == "__main__":
try:
from Tkinter import Tk, Frame
except ImportError:
from tkinter import Tk, Frame
root = Tk()
f = Frame(root, width= 300, height=300)
f.pack()
def callback1(event):
print("callback1")
def callback2(event):
print("callback2")
def callback3(event):
print("callback3")
global_bind(root, "<1>", callback1, add="+")
global_bind(f, "<1>", callback2, add="+")
global_bind(f, "<1>", callback3, add="+")
global_unbind(f, "<1>", callback1)
root.mainloop()
Diff to Previous Revision
--- revision 1 2017-05-02 22:40:55
+++ revision 2 2017-05-05 20:31:45
@@ -6,9 +6,9 @@
_handlers = collections.defaultdict(list)
-def _run_handlers(event_sequence, event):
+def _run_handlers(list_of_handlers, event):
exc_info = None
- for func in _handlers[event_sequence]:
+ for func in list_of_handlers:
try:
func(event)
except SystemExit:
@@ -23,18 +23,21 @@
raise exc_info[0], exc_info[1], exc_info[2]
-def bind_all(w, event, func, add=None):
- if len(_handlers[event]) == 0:
- w.bind_all(event, functools.partial(_run_handlers, event))
+def global_bind(w, event, func, add=None):
+ root = w.nametowidget(".")
+
+ handlers_of_event = _handlers[event]
+ if len(handlers_of_event) == 0:
+ root.bind_all(event, functools.partial(_run_handlers, handlers_of_event))
if add == "+":
- _handlers[event].append(func)
+ handlers_of_event.append(func)
else:
- _handlers[event] = [func]
+ handlers_of_event[:] = [func]
return func
-def unbind_all(w, event, func):
+def global_unbind(w, event, func):
_handlers[event].remove(func)
if len(_handlers[event]) == 0:
@@ -59,10 +62,10 @@
def callback3(event):
print("callback3")
- bind_all(root, "<1>", callback1, add="+")
- bind_all(f, "<1>", callback2, add="+")
- bind_all(f, "<1>", callback3, add="+")
+ global_bind(root, "<1>", callback1, add="+")
+ global_bind(f, "<1>", callback2, add="+")
+ global_bind(f, "<1>", callback3, add="+")
- unbind_all(f, "<1>", callback1)
+ global_unbind(f, "<1>", callback1)
root.mainloop()