Tkinter Text小部件 - 如何找出行数和列数?

时间:2014-04-30 17:37:34

标签: python text tkinter size

有没有办法计算文本小部件的行数和列数(假设所使用的字体对所有字符都有固定的尺寸)?我想在Text小部件中加载和显示二进制文件,但文件可能非常大,在这种情况下,小部件使用大量内存。所以我想在bytearray中加载数据然后只显示相应的部分(这将由滚动条的滑块位置确定),但为此我需要知道在窗口小部件中可以容纳多少行文本(I' m实际上只对行数感兴趣,因为在我的情况下每行包含固定数量的字符)。怎么可以实现呢?

(或者如果对这个特定问题有另一种解决方案,我很高兴听到它。)

2 个答案:

答案 0 :(得分:2)

所以最后我找到了解决问题的方法。通过测量字体高度(以像素为单位)并将其除以Text的高度,可以找到Text中可显示的近似行数。它并不是绝对准确的(我认为这个值也受到文本开头/结尾处的线条和/或间距之间的间距或类似的东西的影响)但我还没有进一步研究它,因为只是这个简单的解决方案有效完全符合我的需要。

这是一个示例代码,以防万一有人需要在将来解决类似的问题。只需运行它,然后调整窗口大小,您就会看到可见行数将如何变化。

# Text widget lines (rows) count example - tested in Python 3.3.2
from tkinter import Text, font as f

class ExampleApp:
    def __init__(self, parent):
        font = f.Font(family="courier", size=12)
        self.line_height = font.metrics("linespace")
        self.text = Text(parent, width=70, height=20, font=font)
        self.text.pack(fill=BOTH, expand=Y)
        self.text.bind("<Configure>", self.linecount)

    def linecount(self, *args):
        num_lines = int(self.text.winfo_height() / self.line_height)
        self.text.delete(0.0, END)
        self.text.insert(0.0,
                         "Approximate number of visible lines: %d" % num_lines)

root = Tk()
root.title("Text widget line count example")
app = ExampleApp(root)
root.mainloop() 

答案 1 :(得分:-1)

使用文本小部件的索引方法,如:

endline, endcolumn = text.index('end').split('.')

此函数以line.charnumber形式返回元组。