该-default
选项确实只是一个显示指示器。它的作用取决于您使用的主题。在 Windows XP 及更高版本上,默认的活动按钮将为亮蓝色。在其他主题上,它可能具有突出显示的边框或依赖的不同边缘。在古老的经典主题上,它是一些巨大的下沉边界。
要在您按 Enter 或 Escape 时实际发生某些事情,您必须将<Return>
and<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 协议消息(即窗口管理器提供的 X 按钮或 Windows 上的 Alt-F4)一起处理。这个也是不可调整大小的,我们使用 Tk 库帮助函数将它放置在应用程序窗口上tk::PlaceWindow
。最后,我们映射窗口并将键盘焦点设置到活动小部件上。
以上几乎涵盖了我认为表现良好的对话的所有内容。