当从回调中选择笔记本选项卡时,如何避免tkinter条目窗口小部件失去焦点

时间:2016-04-12 13:16:50

标签: python tkinter tcl tk

我有一个条目小部件,其回调绑定到<Key> 每当用户在条目小部件中键入内容然后回调 映射到<Key>被调用。回调获取插入到条目小部件中的文本,然后尝试查找标题与文本匹配的Notebook选项卡。如果匹配则调用Notebook.select方法。当调用Notebook.select方法时,选择选项卡并使其子窗口小部件之一得到关注。这种行为不是我想要的,我需要输入小部件来保持焦点。当回调调用Notebook.select时,它基本上失去了焦点。我在条目小部件中使用了grab_set()但是在调用方法笔记本选择时它不会避免失去焦点。

1 个答案:

答案 0 :(得分:0)

此行为可能取决于平台。当我在我的机器上选择一个选项卡时,焦点将保留在条目小部件中。但是,如果您的平台更改焦点,您可以轻松地从回调中重新设置焦点。

这是一个有效的例子。运行代码,当您键入选项卡的名称(例如:&#34; two&#34;)时,将选中该选项卡,但焦点应保留在条目小部件中:

entry .e
ttk::notebook .nb

pack .e -side top -fill x
pack .nb -side top -fill both -expand 1

foreach text {"One" "Two" "Three" "Four"} {
    set frame_name ".nb.page_$text"
    frame $frame_name
    .nb add $frame_name -text $text
    label $frame_name.label -text "This is page $text"
    pack $frame_name.label -padx 20 -pady 20
}

bind .e <KeyRelease> callback

proc callback {} {
    set input [string tolower [.e get]]
    foreach child [winfo children .nb] {
        set text [string tolower [.nb tab $child -text]]
        if {$text eq $input} {
            .nb select $child
            focus .e
        }
    }
}