我在弄清楚如何将文本小部件的光标移动到Tcl / Tk中文本的末尾时遇到了一些麻烦。
我正在编写一个程序,其文本区域的行为类似于命令提示符或终端 - 因此当用户按下时,用户输入的先前命令将在文本末尾重新打印。到目前为止我有这个:
bind .text <Up> {
if {$prev_cmd ne ""} {
.text insert end $prev_cmd
}
}
这将在文本的末尾插入命令 - 但是文本的默认行为仍然有效,因此当按下时,光标将向上移动到上一行,我不想要。
我尝试在插入命令后添加以下行:
.text mark set insert end
但它没有把光标移到文本的末尾,而是停留在前一行的末尾。这可能吗,或者文本小部件无法识别是否添加了新的行/字符串?
答案 0 :(得分:2)
光标是做你想要的。但是,<KeyPress-Up>
事件的类绑定(跟随特定于窗口小部件的绑定)然后应用默认的光标移动事件,并将光标移动到上一行(必须是事情很短暂。)
虽然理论上你可以改变类绑定而不是这样做(它们只是Text
而不是.text
上的绑定)你不应该这样做,因为你将调整行为程序中的每个文本小部件都可能真的让你大吃一惊。相反,您应该通过插入break
来阻止事件绑定标记链处理继续进行类绑定。
bind .text <Up> {
if {$prev_cmd ne ""} {
.text insert end $prev_cmd
break
}
}
其他选项也是可能的,比如创建自己的伪类绑定并使用bindtags
命令附加它们,但这样做的工作要多得多(并且在“高级Tk黑客”的标题下)。您只能在不阻止以后绑定的情况下阻止正常的类绑定(在您的情况下,每个顶层和真正的全局绑定集合 - .
和all
)。