2012-08-07 71 views
2

我已經成功創建了一個使用Gobject Introspection的python GTK應用程序,並在GTKSourceView Widget中打開了一個源文件。GtkSourceView使用Gobject內省滾動到行[python]

我正在嘗試滾動以在用戶單擊按鈕時將特定行(行150)放入屏幕中央。

我已閱讀how to (programmatically) scroll to a specific line in gtktextview/gtksourceview

而且周邊GtkSourceViews,GTKTextView,併爲這兩個緩衝區對象的文檔(這是我的理解是,sourceview從TextView的繼承)

我曾嘗試使用下列方法:

在管線150 -getting一個迭代,然後使用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() 

回答

3

所以這個問題是線路:

self.scrolledwindow.add_with_viewport(self.sourceview) 

按照Gtk docs爲scrolledwindow對象,你應該只使用add_with_viewport的對象,唐」不支持滾動。對於那些做本身喜歡GtkTextView(等通過繼承GtkSourceView),你應該使用GtkContainer.add() ...

希望幫助

+0

這讓我到下一個階段,但是一些行號不正確地跳。 – tel0s 2012-08-07 13:03:43