この-default
オプションは、実際には単なる表示インジケータです。それが何をするかは、使用しているテーマによって異なります。Windows XP 以降では、デフォルトのアクティブ ボタンは明るい青色になります。他のテーマでは、強調表示された境界線または別のエッジが依存している場合があります。古い古典的なテーマでは、それはいくつかの巨大な沈んだ境界線でした.
Enter または Escape を押したときに実際に何かが起こるようにするには、前述のように<Return>
および<Escape>
イベントを関連するボタンにバインドする必要があります。
使用しないでくださいtk_dialog
。それは本当に古くて役に立たず、スタイルは現代のウィンドウシステムにまったく準拠していません。
ダイアログを適切に見せるために、あるアプリで使用するコードのスニペットを次に示します。
proc ::tkchat::Dialog {w args} {
lappend args -class Dialog
set dlg [eval [linsert $args 0 toplevel $w]]
catch {wm attributes $w -type dialog}
wm transient $dlg [winfo parent $dlg]
wm group $dlg .
return $dlg
}
これは、実行すべきいくつかの便利なことを示しています。まず、トップレベルのデフォルト クラスを用意して、ダイアログのデフォルト設定オプションを許可できるようにします。また-type
、サポートされている場合に属性を設定します。これにより、最新の X ウィンドウ マネージャーが、他の種類の一時的なウィンドウではなく、ウィンドウをダイアログとしてスタイル設定できる拡張ウィンドウ マネージャー プロパティが設定されます。また、親ウィンドウの一時的なものとしてマークします。これにより、ウィンドウ マネージャーは、このトップレベルが実際に特定の親ウィンドウまたは所有者ウィンドウに関連付けられていることを認識します (タスクバーは、それを別のアプリケーションとして表示することを回避できます)。
これは、次のような場合に使用されます。
set dlg [Dialog .options]
wm withdraw $dlg
wm title $dlg "Options"
# ... create child windows and pack / grid them
set b_ok [ttk::button $dlg.ok -text OK -underline 0 -default active \
-command [list [namespace origin EditOptionsClose] $dlg ok $pages]]
set b_cn [ttk::button $dlg.cancel -text Cancel -underline 0 \
-command [list [namespace origin EditOptionsClose] $dlg cancel $pages]]
bind $dlg <Return> [list $b_ok invoke]
bind $dlg <Escape> [list $b_cn invoke]
bind $dlg <Alt-o> [list focus $b_ok]
bind $dlg <Alt-c> [list focus $b_cn]
wm protocol $dlg WM_DELETE_WINDOW [list $b_cn invoke]
wm resizable $dlg 0 0
catch {::tk::PlaceWindow $dlg widget .}
wm deiconify $dlg
tkwait visibility $dlg
focus $b_ok ; grab $dlg
tkwait variable [namespace which -variable _editoptions]
grab release $dlg
destroy $dlg
そこではかなり多くのことが起こっています。ダイアログを作成してから取り消します。これにより、多くの子をトップレベルに配置すると、パフォーマンスが向上します。これは、取り消されることで、全体をマップする必要があるまでジオメトリの計算を延期できるためです。次に、ボタンとその他すべてを作成し、それらをトップレベルに配置します。-default オプションを説明するためにボタンだけ-underline
を示し、アクセラレータ キーを表示するために を使用しました。
次にバインディング - Return と Escape は、常に WM_DELETE_WINDOW プロトコル メッセージ (ウィンドウ マネージャーまたは Windows の Alt-F4 によって提供される X ボタン) と共に処理する必要があります。これもサイズ変更不可にし、Tk ライブラリ ヘルパー関数を使用してアプリケーション ウィンドウ上に配置しますtk::PlaceWindow
。最後に、ウィンドウをマップし、アクティブなウィジェットにキーボード フォーカスを設定します。
上記は、行儀の良いダイアログのほとんどすべてをカバーしていると思います。