0

tkBind.c具有三个函数:Tk_BindEventMatchPatternExpandPercents,对于文本或条目小部件中发生的任何事件都会连续调用它们。它们具有指针,例如 ,eventPtr并且bindPtr存储disPtr在小部件上发生的任何类型的事件。这些指针也存储文本,但按字符存储;我想知道整个字符串或文本存储在哪里?那是哪个链表,或者指向该链表的指针在哪里?

4

1 回答 1

1

在特定小部件中编辑的整体文本根本不存储在该文件中。该文件所做的只是打开一个来自显示引擎的事件(“按下了一个键!”、“移动了鼠标!”、“单击了一个按钮!”、“调整了一个小部件的大小!”等)进入使用该bind命令注册的 Tcl 代码的回调。

例如,使用 entry 小部件,一个普通的按键最终会通过注册的脚本路由(在…/library/entry.tclTk 的源代码分发中):

bind Entry <KeyPress> {
    tk::CancelRepeat
    tk::EntryInsert %W %A
}

这是通用键事件(而不是更具体的类似)的绑定(因为它是 on ) ,它按顺序执行两个命令。一个取消正在进行的任何键重复,另一个将实际插入到相关字符序列 ( ) 的当前小部件 ( ) 中。插入代码如下所示:Entry<KeyPress><KeyPress-BackSpace>%W%A

proc ::tk::EntryInsert {w s} {
    if {$s eq ""} {
        return
    }
    catch {
        set insert [$w index insert]
        if {([$w index sel.first] <= $insert)
                && ([$w index sel.last] >= $insert)} {
            $w delete sel.first sel.last
        }
    }
    $w insert insert $s
    EntrySeeInsert $w
}

如果没有实际的字符序列(对于某些键序列可能会发生),则此操作无效,尝试删除选择的内容(如果没有选择,则会静默失败),在插入光标所在的位置进行实际插入($w insert insert $s) 然后尝试确保插入光标的新位置对用户可见。

正在编辑的字符串实际上存储在入口小部件的内部模型中,它string在结构字段中以 UTF-8 格式保存Entry(在 中声明…/generic/tkEntry.h)。如果用户需要,这个值也可以反映到 Tcl 变量中(参见-textvariable配置选项);这在实践中很常见,但不是普遍的或必需的。

于 2013-11-07T20:16:53.997 回答