滚动到ScrolledWindow / TextView的结尾

时间:2013-02-08 10:02:10

标签: python gtk

在使用Python的GTK3程序上我实现了一个日志。这是一个带有TextBuffer的TextView,位于ScrolledWindow中。通过例程,我在此日志中添加了一个新行。之后它应滚动到最后一行。

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)的最后四个参数不会影响结果。

如何运作?

再见马库斯

3 个答案:

答案 0 :(得分:7)

所以我想我知道这个问题。我认为您已连接错误的信号,以便TextView尚未请求新的大小。下面的代码使用size-allocate的{​​{1}}信号,它就像一个魅力。

TextView

答案 1 :(得分:2)

我刚刚使用了这个并使scroll_to_mark行工作。我相信你的问题是将'use_align'设置为False。该行应为:

self.textview.scroll_to_mark(self.textbuffer.get_insert(),0.0,True,0.5,0.5)

答案 2 :(得分:1)

对于gtkmm 3.0 / C ++ 11:

void append(std::string s) {
  textbuffer->insert(textbuffer->end(), s.c_str());

  // Wait for Gui to Redraw with added line to buffer
  while (gtk_events_pending())
    gtk_main_iteration_do(false);

  // Scoll to end of Buffer
  auto it = textbuffer->get_iter_at_line(textbuffer->get_line_count());
  TextView1.scroll_to(it);
}