2

我已经使用 Gobject Introspection 成功创建了一个 python GTK 应用程序,并在 GTKSourceView Widget 中打开了一个源文件。

当用户单击按钮时,我试图滚动以将特定行(第 150 行)放置到屏幕的中心。

我已经阅读了如何(以编程方式)滚动到 gtktextview/gtksourceview 中的特定行

以及围绕 GtkSourceViews、GTKTextView 和这两者的缓冲区对象的文档(据我了解,sourceview 继承自 textview)

我尝试使用以下方法:

- 在第 150 行获取一个迭代器,然后使用 scroll_to_iter() 方法 - 在第 150 行获取一个迭代器,在迭代器处做一个标记,然后使用 scroll_to_mark() 方法

我知道迭代器和标记是正确的,因为我可以成功使用 place_cursor(iter) 方法,并且它成功地将标记放置在第 150 行的末尾,但是使用给定方法滚动到标记或迭代器什么都不做。

滚动到标记方法不返回值,但迭代器方法返回 false。

谁能建议一种方法来实现这一目标?

我的测试代码如下:

from gi.repository import Gtk
from gi.repository import GObject
from gi.repository import GtkSource

class MyApplication (Gtk.Window):

    def __init__(self, *args, **kwargs):
        Gtk.Window.__init__(self, *args, **kwargs)
        self.set_title("SourceView Test")
        self.set_size_request(400, 400)
        self.connect("destroy", Gtk.main_quit)
        self.create_widgets()
        self.show_all()

    def create_widgets(self):
        self.sourceview=GtkSource.View.new()        
        self.lm = GtkSource.LanguageManager.new()
        self.scrolledwindow = Gtk.ScrolledWindow()
        vbox = Gtk.VBox()
        self.add(vbox)
        vbox.pack_start(self.scrolledwindow,True,True,0)
        self.scrolledwindow.add_with_viewport(self.sourceview)      
        self.scrolledwindow.show_all()
        button = Gtk.Button("Jump To Line")
        button.connect("clicked", self.scroll_to_line_and_mark)
        self.open_file_in_srcview("/home/tel0s/source_android/system/core/adb/adb.c")
        vbox.pack_start(button, False, False, 5)

    def open_file_in_srcview(self,filename,*args,**kwargs):
        self.buffer = self.sourceview.get_buffer()
        self.filename = filename
        self.language = self.lm.guess_language(self.filename,None)
        self.sourceview.set_show_line_numbers(True)
        if self.language:
            self.buffer.set_highlight_syntax(True)
            self.buffer.set_language(self.language)
        else:
            print 'No language found for file "%s"' % self.filename
            self.buffer.set_highlight_syntax(False)
        txt = open(self.filename).read()
        self.buffer.set_text(txt)
        self.buffer.place_cursor(self.buffer.get_start_iter())


    def scroll_to_line_and_mark(self,*args,**kwargs):
        print "setting iterator"
        iterator = self.sourceview.get_buffer().get_iter_at_line(150)
        print iterator
        print "scrolling to iter"
        if self.sourceview.scroll_to_iter(iterator,0, False, 0.5, 0.5):
            print "done!"
        else:
            print "scrolling failed!!"

if __name__ == "__main__":
    MyApplication()
    Gtk.main()
4

1 回答 1

3

所以问题是:

self.scrolledwindow.add_with_viewport(self.sourceview)

根据滚动窗口对象的Gtk 文档,您应该只add_with_viewport用于不支持滚动的对象。对于那些天生喜欢GtkTextView(以及继承GtkSourceView)的人,您应该使用GtkContainer.add()...

希望有帮助

于 2012-08-07T10:59:22.557 回答