Gtk:如何在文本视图中获取文件的一部分并与完整文件的滚动条相关联
我正在尝试制作一个非常大的文件编辑器,这个编辑器一次只在内存中存储一部分内容,但在构建我的文本视图对象时遇到了困难。简单来说,我知道我需要能够动态更新文本视图的内容,但我不知道如何让滚动条与整个文件相关联,而文本视图只包含文件的一小部分。
我尝试过在 Gtk.ScrolledWindow 和滚动条上使用 Gtk.Adjustment,虽然我可以扩展滚动条的范围,但它们仍然只适用于缓冲区的范围,而不是文件的大小(我试图通过 Gtk.Adjustment 的参数来设置)当我加载到文本视图时。我需要一个小部件,它能“知道”自己正在查看文件的一部分,并能够根据需要加载或卸载缓冲区,以便查看文件的不同部分。到目前为止,我认为我会响应“change_view”来计算何时我偏离了当前缓冲区,或者即将偏离,并需要加载下一个,但我不知道如何让滚动条的顶部与文件的开头相关联,底部与文件的结尾相关联,而不是与文本视图中加载的缓冲区相关联。
任何帮助都将非常感激,谢谢!
2 个回答
0
我同意el.pescado的回答,但你也可以尝试一种变通的方法。首先,计算一下你正在编辑的文件有多少行。然后在缓冲区里放入一屏的文本,其余的地方用空行填充,这样缓冲区的行数就和文件的行数一样了。
接下来,连接到包含文本视图的滚动窗口的垂直调整的changed
信号,这样每当窗口滚动时,你就会收到通知。发生这种情况时,把缓冲区里原来的文本替换成空行,然后加载你现在正在查看的那部分内容。
你可以用以下代码来判断在文本视图中应该查看哪些行号(可能有错误,我是凭记忆写的,并且在即时转成Python):
visible_rect = textview.get_visible_rect()
top = textview.get_iter_at_location(visible_rect.x, visible_rect.y)
bottom = textview.get_iter_at_location(visible_rect.x, visible_rect.y + visible_rect.height)
top_line, bottom_line = top.get_line(), bottom.get_line()
1
你可能需要自己实现一个Gtk.TextBuffer,因为默认的那个是把整个内容都存储在内存里的。