Gtk:如何使用与完整文件相关的滚动条在文本视图中获取文件的一部分

时间:2010-04-23 12:43:51

标签: python gtk pygtk

我正在尝试创建一个非常大的文件编辑器(编辑器一次只在内存中存储缓冲区的一部分),但是在构建textview对象时我遇到了困难。基本上 - 我知道我必须能够动态更新文本视图缓冲区,并且我不知道如何让滚动条与完整文件相关联,而textview只包含文件的一个小缓冲区。

我在Gtk.ScrolledWindow和ScrollBars上使用了Gtk.Adjustment,但是虽然我可以扩展滚动条的范围,但它们仍然适用于缓冲区的范围,而不是文件大小(我尝试通过Gtk.Adjustment参数)当我加载到textview。我需要一个“知道”它正在查看文件的一部分的小部件,并且可以根据需要加载/卸载缓冲区以查看文件的不同部分。到目前为止,我相信我会响应“change_view”来计算我何时关闭,或者即将离开当前缓冲区并需要加载下一个,但我不知道如何让滚动条有top与文件的开头有关,而bottom与文件的结尾有关,而不是与textview中加载的缓冲区有关。

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

您可能应该创建自己的Gtk.TextBuffer实现,因为默认实现依赖于将整个缓冲区存储在内存中。

答案 1 :(得分: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()