3

我正在尝试使用 PyGTK 编写一个文本查看器小部件,它在主查看窗口旁边显示行号。当然,我希望行号和主窗口彼此同步滚动。不过,我不知道如何让它工作。现在我正在这样做。TextViewer 是 HBox 的子类,它创建两个 TextView 并将它们打包到自身的属性名称 linenums 和 mainview 下。

self.textviewer = TextViewer.TextViewer(self.toplevel)

sw = gtk.ScrolledWindow()
sw.set_vadjustment(self.textviewer.mainview.get_vadjustment())
sw.set_hadjustment(self.textviewer.mainview.get_hadjustment())

sw.add_with_viewport(self.textviewer)

sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)

如果我取出两条 set_Xadjustment 行,则嵌入的 TextViews 的 scroll_to_mark 函数不起作用,这对我的应用程序来说是不可接受的。加入它们后,主文本窗口的滚动速度是行号窗口的两倍,如果我将 ScrolledWindow 的调整设置为 self.textviewer.linenums 的调整,反之亦然。我强烈怀疑这是一个错误。我还尝试自己设置视口并将其调整设置为其中一个 TextView 的调整,但 scroll_to_mark 函数再次停止工作。如何将两个 TextView 同步为一个滚动,以便对其中一个的任何滚动更改同样影响另一个?

编辑:这是我设置小部件的主应用程序中的代码。

self.textviewer = TextViewer.TextViewer(self.toplevel)

sw = gtk.ScrolledWindow()
#These are the lines that toggle between the two problems when (un)commented
sw.set_vadjustment(self.textviewer.mainview.get_vadjustment())
sw.set_hadjustment(self.textviewer.mainview.get_hadjustment())

sw.add_with_viewport(self.textviewer)

sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
4

2 回答 2

1

我很难理解你是如何将这两个gtk.TextViews 打包在HBox. 它们是否都包装在单独的包装中gtk.ScrolledWindow,然后包装在HBox其中,然后再包装到另一个gtk.ScrolledWindow中(您的帖子中提到的那个)?在我看来,这两个gtk.TextViews 都包含在gtk.ScrolledWindow您的TextViewer包装器小部件中。

如果是这种情况,一个简单的解决您的问题的方法,假设两个gtk.TextViews 的高度相同(因此行号与主视图对齐),我建议将它们简单地包装在您的Hboxwithout ScrolledWindows 中。然后您可以使用上面的代码,添加它们,ScrolledWindow并且视口将两者一起移动,就好像它们是一个小部件一样。

如果这不是您的问题,您能否提供有关您的 TextViewer 包装器的更多信息,也许还有更多示例代码?

另外:您可能对gtksourceview感兴趣。使用 gtksourceview2 包,您可以获得 View 小部件的实例:

import gtksourceview2
view = gtksourceview2.View()
于 2012-06-21T18:00:07.833 回答
1

您可能想检查它是如何在 Meld 中实现的。特别是filediff 代码(在此处搜索搜索同步)。

于 2012-06-21T18:14:05.910 回答