Cambiare bool da False a True alla pressione del tasto?

Aug 17 2020

Vorrei lasciare che una variabile booleana cambi quando premo un tasto sulla tastiera.

Ad esempio, scrivo

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

e quindi provare a monitorare le pressioni dei tasti tramite

edown = False;
Dynamic[edown]

Anche se il tasto eora smette di produrre qualsiasi input di testo nel notebook, purtroppo Dynamiccontinua a essere visualizzato False, indipendentemente dalla frequenza con cui premo il tasto e. Cosa sto facendo di sbagliato o come farlo correttamente?

MODIFICARE:

In alternativa, sto provando la CurrentValuefunzione. Per esempio,

Dynamic[CurrentValue["ModifierKeys"]]

viene visualizzato correttamente, ad esempio, quando Ctrlsi preme il tasto. Ma se ci provo

Dynamic[CurrentValue["EventKey"]]

l'output Nonenon importa quale tasto premo. C'è un'opzione per CurrentValueregistrare una normale pressione di un tasto, come una lettera e?

EDIT2:

Quello che sembra funzionare, è

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

ma solo se clicco prima su InputField per metterlo a fuoco.

Risposte

4 kglr Aug 17 2020 at 00:22

L'utilizzo NotebookEventActionscon l'opzione PassEventsUp -> Truefornisce il comportamento desiderato nella versione 11.3 (Windows 10 - 64 bit):

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

Una variazione: alterna tra Falsee Truequando eviene premuto il tasto:

$Version

"11.3.0 per Microsoft Windows (64 bit) (7 marzo 2018)"