我已經成功創建了一個使用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()
這讓我到下一個階段,但是一些行號不正確地跳。 – tel0s 2012-08-07 13:03:43