PyGTK:需要帮助滚动多个TextViews

时间:2012-06-21 16:57:05

标签: python gtk pygtk

我正在尝试用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)

2 个答案:

答案 0 :(得分:1)

我很难理解你是如何在gtk.TextView中填写两个HBox的。它们是否都打包在单独的gtk.ScrolledWindow中,然后打包在HBox内,然后打包到另一个gtk.ScrolledWindow(您帖子中提到的那个)?从听起来对我来说,这两个gtk.TextView都包含在gtk.ScrolledWindow包装小部件中的TextViewer内。

如果是这种情况,一个简单的问题解决方案,授予两个gtk.TextView s高度相同(所以行号与主视图对齐),我建议只需将它们打包在你的没有Hbox的{​​{1}}。然后,您可以使用上面的代码,添加ScrolledWindow,视口将两者集中移动,就像它们是一个小部件一样。

如果这不是您的问题,请提供一些有关TextViewer包装器的更多信息,以及更多示例代码?

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

ScrolledWindow

答案 1 :(得分:1)

您可能想要查看它在Meld中的实现方式。特别是filediff code(搜索在那里搜索同步)。

相关问题