Basculer bool de False à True lors de la pression de la touche

Aug 17 2020

Je voudrais laisser une variable booléenne changer lorsque j'appuie sur une touche du clavier.

Par exemple, j'écris

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

puis essayez de surveiller les pressions sur les touches via

edown = False;
Dynamic[edown]

Bien que la touche ecesse maintenant de produire une entrée de texte dans le cahier, malheureusement, elle Dynamiccontinue toujours à s'afficher False, quelle que soit la fréquence à laquelle j'appuie sur la touche e. Qu'est-ce que je fais mal ou comment le faire correctement?

ÉDITER:

Sinon, j'essaie la CurrentValuefonction. Par exemple,

Dynamic[CurrentValue["ModifierKeys"]]

s'affiche correctement, par exemple lorsque la Ctrltouche est enfoncée. Mais si j'essaye

Dynamic[CurrentValue["EventKey"]]

la sortie est Nonequelle que soit la touche sur laquelle j'appuie. Existe-t-il une option CurrentValuepour enregistrer une pression régulière sur une touche, comme une lettre e?

EDIT2:

Ce qui semble fonctionner, c'est

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

mais seulement si je clique d'abord sur InputField pour le mettre au point.

Réponses

4 kglr Aug 17 2020 at 00:22

L'utilisation NotebookEventActionsavec l'option PassEventsUp -> Truedonne le comportement souhaité dans la version 11.3 (Windows 10 - 64 bits):

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

Une variante: basculer entre Falseet Truelorsque la touche eest enfoncée:

$Version

«11.3.0 pour Microsoft Windows (64 bits) (7 mars 2018)»