เปลี่ยนบูลจาก False เป็น True เมื่อกดปุ่ม?

Aug 17 2020

ฉันต้องการให้ตัวแปรบูลีนสลับเมื่อฉันกดปุ่มบนแป้นพิมพ์

ตัวอย่างเช่นฉันเขียน

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

จากนั้นลองตรวจสอบการกดปุ่มผ่าน

edown = False;
Dynamic[edown]

แม้ว่าeตอนนี้คีย์จะหยุดการป้อนข้อความใด ๆ ลงในสมุดบันทึก แต่น่าเสียดายที่Dynamicยังคงแสดงอยู่เสมอFalseไม่ว่าฉันจะกดปุ่มบ่อยแค่ไหนeก็ตาม ฉันทำอะไรผิดหรือทำอย่างไรจึงจะถูกต้อง?

แก้ไข:

หรือฉันกำลังลองใช้CurrentValueฟังก์ชันนี้ ตัวอย่างเช่น,

Dynamic[CurrentValue["ModifierKeys"]]

แสดงอย่างถูกต้องเช่นเมื่อCtrlมีการกดปุ่ม แต่ถ้าลองแล้ว

Dynamic[CurrentValue["EventKey"]]

ผลลัพธ์Noneไม่ว่าฉันจะกดปุ่มใด มีตัวเลือกCurrentValueที่จะลงทะเบียนกดปุ่มปกติเช่นตัวอักษรeหรือไม่?

แก้ไข 2:

สิ่งที่ดูเหมือนจะได้ผลคือ

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

แต่ถ้าฉันคลิกที่ InputField เป็นครั้งแรกเพื่อนำเข้าสู่โฟกัส

คำตอบ

4 kglr Aug 17 2020 at 00:22

การใช้NotebookEventActionsตัวเลือกPassEventsUp -> Trueจะให้ลักษณะการทำงานที่ต้องการในเวอร์ชัน 11.3 (Windows 10 - 64 บิต):

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

รูปแบบ: สลับระหว่างFalseและTrueเมื่อeกดปุ่ม:

$Version

"11.3.0 สำหรับ Microsoft Windows (64 บิต) (7 มีนาคม 2018)"