[Python-checkins] cpython: Issue #27294: Numerical state in the repr for Tkinter event objects is now

serhiy.storchaka python-checkins at python.org
Sat Jun 18 14:55:44 EDT 2016


https://hg.python.org/cpython/rev/e0ec4abe659f
changeset:   102095:e0ec4abe659f
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sat Jun 18 21:55:26 2016 +0300
summary:
  Issue #27294: Numerical state in the repr for Tkinter event objects is now
represented as a compination of known flags.

files:
  Lib/tkinter/__init__.py |  29 +++++++++++++++++++++--------
  Misc/NEWS               |   3 +++
  2 files changed, 24 insertions(+), 8 deletions(-)


diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py
--- a/Lib/tkinter/__init__.py
+++ b/Lib/tkinter/__init__.py
@@ -220,28 +220,41 @@
     delta - delta of wheel movement (MouseWheel)
     """
     def __repr__(self):
-        state = {k: v for k, v in self.__dict__.items() if v != '??'}
+        attrs = {k: v for k, v in self.__dict__.items() if v != '??'}
         if not self.char:
-            del state['char']
+            del attrs['char']
         elif self.char != '??':
-            state['char'] = repr(self.char)
+            attrs['char'] = repr(self.char)
         if not getattr(self, 'send_event', True):
-            del state['send_event']
+            del attrs['send_event']
         if self.state == 0:
-            del state['state']
+            del attrs['state']
+        elif isinstance(self.state, int):
+            state = self.state
+            mods = ('Shift', 'Lock', 'Control',
+                    'Mod1', 'Mod2', 'Mod3', 'Mod4', 'Mod5',
+                    'Button1', 'Button2', 'Button3', 'Button4', 'Button5')
+            s = []
+            for i, n in enumerate(mods):
+                if state & (1 << i):
+                    s.append(n)
+            state = state & ~((1<< len(mods)) - 1)
+            if state or not s:
+                s.append(hex(state))
+            attrs['state'] = '|'.join(s)
         if self.delta == 0:
-            del state['delta']
+            del attrs['delta']
         # widget usually is known
         # serial and time are not very interesing
         # keysym_num duplicates keysym
         # x_root and y_root mostly duplicate x and y
         keys = ('send_event',
-                'state', 'keycode', 'char', 'keysym',
+                'state', 'keysym', 'keycode', 'char',
                 'num', 'delta', 'focus',
                 'x', 'y', 'width', 'height')
         return '<%s event%s>' % (
             self.type,
-            ''.join(' %s=%s' % (k, state[k]) for k in keys if k in state)
+            ''.join(' %s=%s' % (k, attrs[k]) for k in keys if k in attrs)
         )
 
 _support_default_root = 1
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 Library
 -------
 
+- Issue #27294: Numerical state in the repr for Tkinter event objects is now
+  represented as a compination of known flags.
+
 - Issue #27177: Match objects in the re module now support index-like objects
   as group indices.  Based on patches by Jeroen Demeyer and Xiang Zhang.
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list