如何使用Tk按钮的-default选项?

时间:2013-08-07 02:23:48

标签: tcl tk

Ttk::button的{​​{1}} -default选项表明它应该在对话框中使用,但我知道的唯一对话框函数是docs,它不能将按钮作为参数而只能作为按钮标题。

有没有人有一个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”,它们都不是默认选择的按钮。 (这是有道理的,因为第4个参数为空)。 tk_dialog本身可以指定默认按钮,但我无法将自定义按钮传递给它,它似乎只接受按钮名称的字符串。

我问这个的原因是因为我正在编写一种绑定到Tk的语言,并且必须弄清楚应该暴露哪些设置。我已经查看了Tkinter的Python,它似乎没有包含按钮的-default选项。这个选项是否曾在Tk中使用过,如果是这样,你能给我一个正确的工作示例吗?感谢。

3 个答案:

答案 0 :(得分:1)

-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
}

这显示了一些有用的事情要做。首先,我们有一个toplevel的默认类,所以我们可以允许对话框的默认配置选项。我们还设置了支持的-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将它放在应用程序窗口上。最后,我们映射窗口并将键盘焦点设置到活动小部件上。

以上几乎涵盖了我认为的一个表现良好的对话框。

答案 1 :(得分:0)

文档(for -default)很差并且过时了。

-default active只是一个显示选项,并没有影响密钥的作用。使用旧样式按钮,-default active将打开高亮背景区域中按钮周围的凹陷浮雕,作为该按钮是默认按钮的指示。它也有点混乱,因为'active'与按钮状态无关,而且与亮点有关。

ttk :: widgets不再支持突出显示背景区域,虽然接受配置选项,但不使用它们。

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

bind . <Return> {.button2 invoke}

答案 2 :(得分:0)

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

enter image description here

&#34;选择&#34;按钮目前是焦点。

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

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