ModX in event.state in tkinter?

Question:

I’ve been figuring out how to parse tkinter events via event.state to reduce the number of times that I have to call root.bind() (e.g., I can avoid binding both "<ButtonPress-1>" and "<Shift-ButtonPress-1>" by finding if shift was pressed via event.state). Of course, I’ve relied heavily on the tkinter source code (specifically the definition for __repr__, starting on line 234) to convert the integer of event.state to something I can understand:

def getStatefromInt(state_int):
    # from https://github.com/python/cpython/blob/3.8/Lib/tkinter/__init__.py
    if isinstance(state_int, int):
        state = state_int
        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))
        return s

One of the things that keeps coming up out of state when events occur is Mod1. What do Mod1 and the other ModX states represent? I thought the number might correspond to the type of button press, but all types of mouse clicks cause only Mod1. I have not been able to find information on what this means online, and I’m having a hard time seeing from the source code what it might mean.

Asked By: TimH

||

Answers:

ModX represents a modification, a Modifier Key.

In computing, a modifier key is a special key (or combination) on a
computer keyboard that temporarily modifies the normal action of
another key when pressed together. By themselves, modifier keys
usually do nothing; that is, pressing any of the ⇧ Shift, Alt, or Ctrl
keys alone does not (generally) trigger any action from the computer.

Tkinter is a crossplatform GUI-Toolkit and uses system specific facilities. Different OS using different methods, for example a PC that runs Linux signals Alt Gr as Mod 5 while a PC running Windows signals the same keystroke as Control-Alt. You can look at the Modifier Keys on tcl-lang.ord.

Event.state is a bit mask indicating which of certain modifier keys and mouse buttons were down or active when the event triggered and is not reliable because of the system specific facilities as pointed out here.

As a side-note the NMT claim that these bitmasks are valid to test during a event:

  • Mask Modifier
  • 0x0001 Shift.
  • 0x0002 Caps Lock.
  • 0x0004 Control.
  • 0x0008 Left-hand Alt.
  • 0x0010 Num Lock.
  • 0x0080 Right-hand Alt.
  • 0x0100 Mouse button 1.
  • 0x0200 Mouse button 2.
  • 0x0400 Mouse button 3.

Another StackOverflow answer that shows how you could use it.

Answered By: Thingamabobs