2016-08-31 8 views
0

При создании строки меню я заметил, что Ctrl + сек ярлыка/Ускоритель работает нормально для вызова меню сохранения, но Ctrl + S (или Ctrl + s с CAPS включено) не вызывает меню «Сохранить». Ниже приведен код.TCL-ок: без учета регистра ускоритель (или несколько ускорителей) для пункта меню

$fileMenu add command -label "Save As" -command { saveOperation } -underline 1 -accelerator "Ctrl-s" 

Можно ли иметь регистронезависимый акселератор для пункта меню или несколько ускорителей для пункта меню, которые захватывают нажатие в обеих случаях?

ответ

3

Если я что-то не хватает, опция -accelerator является лишь визуальным компонентом метки меню. Вам все равно нужно создать привязку для этого, чтобы что-то сделать. Таким образом, чтобы создать регистрозависимости акселератор, вы могли бы сделать что-то вроде:

$fileMenu add command -label "Save As" -command {saveOperation} \ 
     -underline 1 -accelerator "Ctrl-s" 

# I'm assuming the parent window is where you want the accelerator to work 
set w [winfo parent $fileMenu] 

bind $w <Control-KeyPress-s> saveOperation ; # lowercase 
bind $w <Control-KeyPress-S> saveOperation ; # uppercase 
+1

Вместо вызова команды в связывании, можно вызвать пункт меню: 'привязки $ W [список $ FileMenu ссылаться {Save As }] '. Какой способ предпочтительнее зависит от вашей структуры программы, но привязка к элементу меню означает, что если вы отключите пункт меню, привязка будет подавлена ​​(она срабатывает, но не действует). –

+1

Я обычно направляю как ускорители, так и пункты меню через объект действия (терминологию заимствования из Java Swing), которая также знает, как отключить и на _all_ местах, которые проходят через него. Использование общей модели всегда помогает снизить кажущуюся внутреннюю сложность графического интерфейса ... –