tkBind.c
具有三个函数:Tk_BindEvent
、MatchPattern
和ExpandPercents
,对于文本或条目小部件中发生的任何事件都会连续调用它们。它们具有指针,例如 ,eventPtr
并且bindPtr
存储disPtr
在小部件上发生的任何类型的事件。这些指针也存储文本,但按字符存储;我想知道整个字符串或文本存储在哪里?那是哪个链表,或者指向该链表的指针在哪里?
1 回答
在特定小部件中编辑的整体文本根本不存储在该文件中。该文件所做的只是打开一个来自显示引擎的事件(“按下了一个键!”、“移动了鼠标!”、“单击了一个按钮!”、“调整了一个小部件的大小!”等)进入使用该bind
命令注册的 Tcl 代码的回调。
例如,使用 entry 小部件,一个普通的按键最终会通过注册的脚本路由(在…/library/entry.tcl
Tk 的源代码分发中):
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
配置选项);这在实践中很常见,但不是普遍的或必需的。