2013-02-08 10 views
6

GTK3プログラムでPythonを使ってログを実装しました。これは、TextBufferがScrolledWindow内にあるTextViewです。ルーチンでは、このログに新しい行を追加します。その後、最後の行までスクロールする必要があります。ScrollledWindow/TextViewの末尾までスクロール

def append_log(self, line): 
    self.textbuffer.insert(self.textbuffer.get_end_iter(), "\n"+line, -1) 
    # scrolling down 

それは次のようになります。http://www.physik.tu-dresden.de/~s9472632/log_manual.png

しかし、それは動作しません。私は次のコードを試した。

# nothing happens 
adj = self.scrolledwindow.get_vadjustment() 
adj.set_value(adj.get_upper()-adj.get_page_size()) # same without subtraction (only upper or page_size) 
self.scrolledwindow.set_vadjustment(adj)    # with and without this line 

# nothing happens 
self.textview.scroll_to_iter(self.textbuffer.get_end_iter(), 0.0, False, 0.5, 0.5) 

# works a bit but scroll bars cover the text (see picture below) 
self.textview.scroll_to_mark(self.textbuffer.get_insert(), 0.0, False, 0.5, 0.5) 

画像:http://www.physik.tu-dresden.de/~s9472632/log_scroll.png

scroll_toの*(within_margin、use_align、xalign、yalign)の最後の4つの引数は結果の影響を持っていないようです。

どのように機能しますか?

バイマークス

+0

をネイティブスクロール機能を持​​つ子のaddメソッドを使用していることを確認してください。これはC APIの 'container_add'です。 – ergosys

答えて

5

だから私は問題を知っていると思う。間違った信号を接続して、TextViewがまだ新しいサイズを要求していないと思います。以下のコードは、TextViewsize-allocate信号を使用しており、魅力的に機能します。

#!/usr/bin/env python 

from gi.repository import Gtk, GObject 


class W(Gtk.Window): 

    def __init__(self): 

     super(W, self).__init__() 
     self.connect("destroy", Gtk.main_quit) 
     self.set_default_size(200, 400) 

     self._msg_i = 0 
     self._sw = Gtk.ScrolledWindow() 
     self.add(self._sw) 

     self._tw = Gtk.TextView() 
     self._tb = self._tw.get_buffer() 

     self._sw.add_with_viewport(self._tw) 
     #The signal should at least be connected after the scrolled window 
     #is created, since the callback works on it. 
     self._tw.connect("size-allocate", self._autoscroll) 

     GObject.timeout_add(400, self.sim_log) # Invokes spamming 
     self.show_all() 

    def sim_log(self, *args): 
     """A simple spamming function to emulate some sort of logging""" 
     self._msg_i += 1 
     i = self._tb.get_end_iter() 
     self._tb.insert(i, "\n* Message {0} recieved!".format(self._msg_i), -1) 
     return True 

    def _autoscroll(self, *args): 
     """The actual scrolling method""" 
     adj = self._sw.get_vadjustment() 
     adj.set_value(adj.get_upper() - adj.get_page_size()) 


if __name__ == "__main__": 

    w = W() 
    Gtk.main() 
2

私はこれを持っていて、scroll_to_markのラインの仕事をしました。あなたの問題が 'use_align'をFalseに設定していたと思います。ライン読み込みする必要があります。

self.textview.scroll_to_mark(self.textbuffer.get_insert()、0.0、真の、0.5、0.5)gtkmmの3.0

関連する問題