有没有比我提出的这个临时函数(在python3.4.2中)更有效的方法来获取文本插入后留在tkinter
Text
小部件中的显示行总数(不仅仅是可见行):
def get_display_lines():
#Gets the total number of display lines after the text insert in the current tab (not just those on-screen, though).
myTextWidget.mark_set("dlines", INSERT)
count=0
while 1:
if myTextWidget.compare("dlines", ">=", "end-1c linestart"):
break
else:
myTextWidget.mark_set("dlines", "dlines + 1 display line")
count+=1
return count
不管怎样,这段代码是有效的,但是效率很低。我用它来计算剩余文档自动滚动的剩余时间。使用箭头键移动文本插入时,效率低下会导致问题(它调用此函数以显示当前的准确时间)。它使移动插入的速度慢得多,更新速度也慢得多,甚至可以使其崩溃/冻结。在
我知道有更有效的方法来获取文本小部件中的行总数。但是,我需要显示行,因为用autoscroll阅读通常是在wordwrap打开的情况下完成的。在
我的自动滚动功能从每隔几秒插入一个用户选择的行数开始下降(用户也选择了多少秒)。这不是通过滚动条完成的。在
如果您只关心在文档中滚动的时间,并且数据在您滚动时没有改变(即:没有添加新行),您可以简单地计算文档占用的像素数(只需执行一次),以及您当前在文档中的位置。这会告诉你还有多少像素。从中你应该能够计算出大概需要多少时间。在
您可以使用
myTextWidget.count("1.0", "end", "ypixels"
获得文本小部件中使用的像素总数。然后可以使用myTextWidget.dlineinfo("insert")
获得当前行的y坐标。根据这两个数字,您可以计算出插入点距小部件末尾的距离的百分比。在好吧,我找到了答案(是的,这是一个有目的的答案,这不是我问题的一部分)。在
以下代码将更有效地给出插入文本后剩余的显示行数:
虽然这样效率更高,但仍然不是完全有效的,并且在处理大文件时会遇到问题(如果在自动滚动期间经常使用箭头键)。count()方法返回一个元组;因此是零索引。因为这并不总是包含一个数字(比如在文档的末尾插入),所以我使用try/except块(尽管您可以通过其他很多方法来实现这一点;但是您可以随意选择)。在
因为这对于大文件来说效率不高,所以您可能只需要保留当前行一次,保存它们,并在更新状态时递增/递减该变量(当然,这需要编辑一堆函数,但效率更高)。不过,您需要在编辑过程中更新总计(幸运的是,在自动滚动时这不太常见)。在
因为处理许多其他函数是一个很大的开销,并且增加了编辑代码的复杂性,所以我建议只在自动滚动的时间间隔内更新它,而不是在用户手动移动光标时更新。另外,为了提高效率,不要让它计算statusbar update方法中的剩余行数(更不用说剩余的时间),而只在计时器调用的方法中保存的变量中计算它,而只在statusbar中打印变量。在
相关问题 更多 >
编程相关推荐