在插入之后,获取Tkinter文本小部件的总显示行数的最有效方法是什么?

2024-09-30 20:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有比我提出的这个临时函数(在python3.4.2中)更有效的方法来获取文本插入后留在tkinterText小部件中的显示行总数(不仅仅是可见行):

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打开的情况下完成的。在

我的自动滚动功能从每隔几秒插入一个用户选择的行数开始下降(用户也选择了多少秒)。这不是通过滚动条完成的。在


Tags: the方法函数用户文本部件countdisplay
2条回答

如果您只关心在文档中滚动的时间,并且数据在您滚动时没有改变(即:没有添加新行),您可以简单地计算文档占用的像素数(只需执行一次),以及您当前在文档中的位置。这会告诉你还有多少像素。从中你应该能够计算出大概需要多少时间。在

您可以使用myTextWidget.count("1.0", "end", "ypixels"获得文本小部件中使用的像素总数。然后可以使用myTextWidget.dlineinfo("insert")获得当前行的y坐标。根据这两个数字,您可以计算出插入点距小部件末尾的距离的百分比。在

好吧,我找到了答案(是的,这是一个有目的的答案,这不是我问题的一部分)。在

以下代码将更有效地给出插入文本后剩余的显示行数:

def get_display_lines(start="insert", end="end-1c")
    try:
        count=myTextWidget.count(start, end, "displaylines")[0]
    except TypeError:
        count=0
    return count

虽然这样效率更高,但仍然不是完全有效的,并且在处理大文件时会遇到问题(如果在自动滚动期间经常使用箭头键)。count()方法返回一个元组;因此是零索引。因为这并不总是包含一个数字(比如在文档的末尾插入),所以我使用try/except块(尽管您可以通过其他很多方法来实现这一点;但是您可以随意选择)。在

因为这对于大文件来说效率不高,所以您可能只需要保留当前行一次,保存它们,并在更新状态时递增/递减该变量(当然,这需要编辑一堆函数,但效率更高)。不过,您需要在编辑过程中更新总计(幸运的是,在自动滚动时这不太常见)。在

因为处理许多其他函数是一个很大的开销,并且增加了编辑代码的复杂性,所以我建议只在自动滚动的时间间隔内更新它,而不是在用户手动移动光标时更新。另外,为了提高效率,不要让它计算statusbar update方法中的剩余行数(更不用说剩余的时间),而只在计时器调用的方法中保存的变量中计算它,而只在statusbar中打印变量。在

相关问题 更多 >