【问题标题】:how to avoid a tkinter entry widget to lose focus when a notebook tab is selected from a callback当从回调中选择笔记本选项卡时,如何避免 tkinter 条目小部件失去焦点
【发布时间】:2016-04-12 13:16:49
【问题描述】:

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

【问题讨论】:

标签: python tkinter tcl tk


【解决方案1】:

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

这是一个工作示例。运行代码,当您输入选项卡的名称时(例如:“two”),选项卡将被选中,但焦点应保留在条目小部件中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多