¿Cambiar bool de Falso a Verdadero al presionar una tecla?

Aug 17 2020

Me gustaría permitir que una variable booleana cambie cuando presiono una tecla en el teclado.

Por ejemplo, escribo

activateE := Block[{}, edown = True;];
SetOptions[EvaluationNotebook[], NotebookEventActions -> {{"KeyDown", "e"} :> activateE}]

y luego intente controlar las pulsaciones de teclas a través de

edown = False;
Dynamic[edown]

Si bien la tecla eahora deja de producir cualquier entrada de texto en el cuaderno, desafortunadamente Dynamicsiempre se sigue mostrando False, independientemente de la frecuencia con la que presione la tecla e. ¿Qué estoy haciendo mal o cómo hacerlo correctamente?

EDITAR:

Alternativamente, estoy probando la CurrentValuefunción. Por ejemplo,

Dynamic[CurrentValue["ModifierKeys"]]

muestra correctamente, por ejemplo, cuando Ctrlse presiona la tecla. Pero si lo intento

Dynamic[CurrentValue["EventKey"]]

la salida es Nonesin importar qué tecla presione. ¿Existe una opción CurrentValuepara registrar una pulsación de tecla regular, como una letra e?

EDIT2:

Lo que parece funcionar es

EventHandler[InputField[], {"KeyDown", "e"} :> activateE]

pero solo si primero hago clic en InputField para enfocarlo.

Respuestas

4 kglr Aug 17 2020 at 00:22

El uso NotebookEventActionscon la opción PassEventsUp -> Trueproporciona el comportamiento deseado en la versión 11.3 (Windows 10 - 64 bit):

ClearAll[activateE]
activateE:=  Block[{}, edown = True;];
SetOptions[EvaluationNotebook[], 
 NotebookEventActions -> {{"KeyDown", "e"} :> activateE, PassEventsUp -> True}]

Una variación: alternar entre Falsey Truecuando ese presiona la tecla :

$Version

"11.3.0 para Microsoft Windows (64 bits) (7 de marzo de 2018)"