Alihkan bool dari False ke True saat tombol ditekan?

Aug 17 2020

Saya ingin membiarkan variabel boolean beralih saat saya menekan tombol pada keyboard.

Misalnya, saya menulis

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

dan kemudian coba pantau penekanan tombol melalui

edown = False;
Dynamic[edown]

Sementara tombol esekarang berhenti menghasilkan input teks apa pun ke dalam notebook, sayangnya tombol tersebut Dynamicselalu terus ditampilkan False, terlepas dari seberapa sering saya menekan tombol tersebut e. Apa yang saya lakukan salah, atau bagaimana melakukan ini dengan benar?

EDIT:

Atau, saya mencoba CurrentValuefungsinya. Sebagai contoh,

Dynamic[CurrentValue["ModifierKeys"]]

menunjukkan dengan benar misalnya saat Ctrltombol sedang ditekan. Tetapi jika saya mencoba

Dynamic[CurrentValue["EventKey"]]

hasilnya Nonetidak peduli tombol mana yang saya tekan. Apakah ada opsi CurrentValueyang akan mendaftarkan penekanan tombol biasa, seperti surat e?

EDIT2:

Apa yang tampaknya berhasil, adalah

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

tetapi hanya jika saya pertama kali mengklik InputField untuk menjadikannya fokus.

Jawaban

4 kglr Aug 17 2020 at 00:22

Menggunakan NotebookEventActionsdengan opsi PassEventsUp -> Truememberikan perilaku yang diinginkan dalam Versi 11.3 (Windows 10-64 bit):

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

Variasi: Beralih antara Falsedan Truesaat tombol editekan:

$Version

"11.3.0 untuk Microsoft Windows (64-bit) (7 Maret 2018)"