<p>答案是,在处理标记时,特金特并不认为<code>"insert"</code>和<code>index("insert")</code>是一回事。从文本的角度来看,它们是相同的,但是从文本小部件管理的所有其他数据的角度来看,它们是不同的。你知道吗</p>
<p>考虑一个文本小部件,在第1行有文本“Hello,world”。当您单击字母“w”时,会发生一些事情:tkinter将添加标记“insert”、“tk::anchor1”和“current”。这些标记是订购的。如果要将文本小部件内容转换为xml,它可能如下所示:</p>
<pre><code><text index='1.0'>Hello, </text>
<mark index='1.7' id='current'/>
<mark index='1.7' id='tk::anchor1'/>
<mark index='1.7' id='insert'/>
<text index='1.7'>world</text>
</code></pre>
<p>调用<code>mark_previous("1.7")</code>时,索引“1.7”指的是紧靠字母“w”之前的点和所有标记之后的点。因此,当您请求上一个标记时,它将返回“insert”,因为这是紧靠字母“w”左侧的内容。但是,如果您要求使用“insert”之前的标记而不是“1.7”,您将得到“tk::anchor1”,因为它是“insert”标记左侧的标记。你知道吗</p>
<p>您可以使用文本小部件<code>dump</code>方法查看标记和数据的顺序。它以列表而不是xml的形式返回信息,但它允许您查看文档的内部结构。你知道吗</p>
<p>继续使用相同的示例(“Hello,world”,在单击“w”之前,<code>dump</code>方法返回以下内容(为了清楚起见,我添加了新行):</p>
<pre><code>[
('text', 'Hello, ', '1.0'),
('mark', 'current', '1.7'),
('mark', 'tk::anchor1', '1.7'),
('mark', 'insert', '1.7'),
('text', 'world\n', '1.7')
]
</code></pre>
<p>如您所见,标记“current”位于标记“tk::anchor1”之前,该标记位于“insert”之前,该标记位于“world”中的字母“w”之前。你知道吗</p>