<p>根本问题是在返回runloop之前调用<code>dlineinfo</code>,因此文本还没有布局。在</p>
<p>如<a href="http://effbot.org/tkinterbook/text.htm#Tkinter.Text.dlineinfo-method" rel="nofollow">the docs</a>解释:</p>
<blockquote>
<p>This method only works if the text widget is updated. To make sure this is the case, you can call the update_idletasks method first.</p>
</blockquote>
<p>与往常一样,要获得更多信息,您必须求助于<a href="http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/text-methods.html" rel="nofollow">Tcl docs for the underlying object</a>,它基本上告诉您,文本小部件在更新之前可能无法正确判断哪些字符是可见的或不可见的,在这种情况下,它可能返回<code>None</code>,这不是因为任何问题,而是因为,就它而言,你要的是屏幕外的东西。在</p>
<p>测试是否存在问题的一个好方法是在调用<code>dlineinfo(i)</code>之前调用<code>self.__text.see(i)</code>。如果它改变了<code>dlineinfo</code>的结果,这就是问题所在。(或者,如果不是这样的话,至少是与之相关的东西,不管出于什么原因,Tk会在第1行离开屏幕后思考所有事情。)</p>
<p>但是在这种情况下,即使调用<code>update_idletasks</code>也不起作用,因为它不仅仅是更新需要更新的行信息,而是首先安排文本。您需要做的是显式地延迟这个调用。例如,将这一行添加到<code>load_from_file</code>的底部,现在它可以工作了:</p>
<pre><code>self.__text.after(0, self.__update_line_numbers)
</code></pre>
<p>您也可以在调用<code>self.__update_line_numbers()</code>内联之前调用<code>self.__text.update()</code>,我认为这应该行得通。在</p>
<hr/>
<p>顺便说一句,这将真正帮助您在调试器下运行它,或者在循环的顶部添加一个<code>print(i, dline)</code>,这样您就可以看到您得到了什么,而不仅仅是猜测。在</p>
<p>另外,仅仅增加一个<code>linenumber</code>并使用<code>'{}.0'.format(linenumber)</code>而不是创建像<code>@0,0+1line+1line+1line</code>这样(至少对我来说)不起作用的复杂索引不是更容易吗。您可以调用<code>Text.index()</code>将任何索引转换为规范格式,但是为什么要这么困难呢?你知道你想要的是<code>1.0</code>,<code>2.0</code>,<code>3.0</code>等等,对吗?在</p>