2012-08-07 1 views
2

J'ai réussi à créer une application python GTK à l'aide de Gobject Introspection et ouvert un fichier source dans un widget GTKSourceView.GtkSourceView Faites défiler jusqu'à la ligne avec Gobject Introspection [python]

Je tente de faire défiler pour placer une ligne spécifique (ligne 150) au centre de l'écran lorsque l'utilisateur clique sur un bouton.

J'ai lu how to (programmatically) scroll to a specific line in gtktextview/gtksourceview

et aussi la documentation entourant GtkSourceViews, GtkTextView et les objets tampons pour ces deux (je crois comprendre que le SourceView hérite de la textview)

J'ai essayé de utiliser les méthodes suivantes:

cette obtention d'un itérateur à la ligne 150, puis en utilisant la méthode scroll_to_iter() - à obtenir un itérateur à la ligne 150, ce qui rend une marque à l'itérateur, puis en utilisant la méthode scroll_to_mark()Je sais que les itérateurs et les marques sont corrects, car je peux utiliser la méthode place_cursor (iter) avec succès et placer le marqueur à la fin de la ligne 150, mais en faisant défiler la marque ou l'itérateur en utilisant les méthodes données ne fait rien.

La méthode scroll to mark ne renvoie pas de valeur, mais la méthode itérateur renvoie false.

Quelqu'un peut-il suggérer un moyen d'y parvenir?

Mon code de test est comme suit:

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() 

Répondre

3

La question est donc la ligne:

self.scrolledwindow.add_with_viewport(self.sourceview) 

Selon le Gtk docs pour les objets ScrolledWindow, vous ne devez utiliser add_with_viewport pour les objets qui n » t soutenir le défilement. Pour ceux qui ne le font nativement comme GtkTextView (et donc par héritage GtkSourceView), vous devez utiliser GtkContainer.add() ...

espoir qui aide

+0

Cela m'a fait à l'étape suivante, mais certains numéros de ligne DonT sauter correctement. – tel0s

Questions connexes