2

's option的文档表明它应该在对话框中使用,但是我知道的唯一对话框函数是tk_dialog,它不能将按钮作为参数,而只能将按钮标题作为参数。Ttk::button-default

有没有人有一个可行的例子,Ttk::button它的-default选项设置为active,在运行应用程序并且用户点击这个按钮时,enter这个按钮被调用?这是我的尝试:

我试图直接在主窗口中布置一个按钮:

package require Tk

ttk::button .button -text "text" -default active -command "puts sometext"
bind .button <Return> { .button invoke }

pack .button

默认情况下,按下enter没有任何作用,我首先必须tab选择按钮,然后点击enter才会起作用。

我也尝试将按钮注入tk_dialog,认为以下可能有效:

package require Tk

tk_dialog .dg "Title" "Question" "" "" \
[ttk::button .button1 -text "Yes" -default disabled] \
[ttk::button .button2 -text "No" -default active]

但这只会创建两个按钮“.button1”和“.button2”,而且它们都不是默认选择的。(这是有道理的,因为第四个参数是空的)。tk_dialog本身可以指定默认按钮,但我不能将自定义按钮传递给它,它似乎只接受按钮名称的字符串。

我问这个的原因是因为我正在编写与 Tk 的语言绑定,并且必须弄清楚应该公开哪些设置。我看过TkinterPython,它似乎没有包装-default按钮的选项。这个选项是否曾经在 中使用过Tk,如果是的话,你能给我一个合适的工作例子吗?谢谢。

4

3 回答 3

1

-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。最后,我们映射窗口并将键盘焦点设置到活动小部件上。

以上几乎涵盖了我认为表现良好的对话的所有内容。

于 2013-11-14T01:14:41.887 回答
0

正如 patthoyts 所说,它只是一个显示选项。在我的机器上它看起来像这样(使用 Tile)

在此处输入图像描述

“选定”按钮当前具有焦点。

我用来创建它的脚本很简单:

grid [ttk::button .b -default active -text Ok] [ttk::button .c -default disabled -text Cancel] -sticky nesw
grid [ttk::button .b -text Normal] [ttk::button .c -text Selected] -sticky nesw
grid rowconfigure . all -weight 1
grid columnconfigure . all -weight 1
于 2013-11-14T18:12:34.743 回答
0

文档(用于 -default)很差而且过时了。

-default active只是一个显示选项,并不影响键的作用。使用旧式按钮,-default active将在突出显示背景区域中打开按钮周围的凹陷浮雕,作为默认按钮的指示。这也有点令人困惑,因为“活动”与按钮状态无关,而与高亮有关。

ttk:: 小部件不再支持高亮背景区域,尽管配置选项被接受,但它们不被使用。

如果您希望该键在对话框中执行特定操作,请将其绑定到主窗口,而不是特定按钮:

bind . <Return> {.button2 invoke}
于 2013-11-14T00:02:33.173 回答