Tkinter Text控件 - 如何找到行数和列数?
有没有办法知道一个文本框的行数和列数(前提是使用的字体每个字符的大小都是固定的)?我想在文本框里加载和显示二进制文件,但这些文件可能会很大,这样文本框就会占用大量内存。所以我想先把数据加载到一个字节数组里,然后只显示合适的部分(这个部分是根据滚动条的位置来决定的)。但为了做到这一点,我需要知道文本框里能放多少行文本(其实我只关心行数,因为在我的情况下,每行会有固定数量的字符)。请问这个怎么实现呢?
(或者如果有其他解决这个问题的方法,我也很想知道。)
2 个回答
-1
使用文本控件的索引方法,像这样:
endline, endcolumn = text.index('end').split('.')
这个函数会返回一个元组,格式是行号.字符位置。
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()