如何自动滚动gtk.scrolledwindow?

时间:2011-03-07 11:11:18

标签: python gtk pygtk gtktreeview scrolledwindow

我在ScrolledWindow中有一个treeview-widget,它在运行时填充。我希望ScrolledWindow自动滚动到列表的末尾。每次在树视图中插入一行时,我通过调整vadjustment的{​​{1}}来“解决”问题。 e.g:

ScrolledWindow

如果我在交互式ipython会话中运行代码并自行设置值,一切都按预期工作。

如果我使用默认的python解释器运行代码,则自动滚动不会一直有效。我调试了代码,问题似乎是,调整值有某种“滞后”,只是在一段时间后才会改变。

我的问题是:如何可靠地滚动到if new_line_in_row: adj = self.scrolled_window.get_vadjustment() adj.set_value( adj.upper - adj.page_size ) 的最大位置?是一个特殊的信号生成,我可以使用?还是有更好的方法来设置ScrolledWindow

5 个答案:

答案 0 :(得分:22)

在扩大搜索范围后,我发现了一个与ruby相关的答案。由于问题与gtk相关,它应该可以用这样的语言解决:

连接窗口小部件,在我的情况下是树视图,用gtk.widget的'size-allocate'信号进行更改,并将gtk.scrolledwindow值设置为“upper - page_size”。例如:

self.treeview.connect('size-allocate', self.treeview_changed)

...

def treeview_changed(self, widget, event, data=None):
    adj = self.scrolled_window.get_vadjustment()
    adj.set_value( adj.upper - adj.page_size )

链接到ruby-forum.com上的原始帖子:

hint hint

答案 1 :(得分:8)

fookatchu的答案可以改进,以便多个小部件可以使用回调:

def treeview_changed( self, widget, event, data=None ):
    adj = widget.get_vadjustment()
    adj.set_value( adj.upper - adj.pagesize )

答案 2 :(得分:5)

Python Gtk 3版本:

adj.set_value(adj.get_upper() - adj.get_page_size())

答案 3 :(得分:0)

仍然需要回调(我使用了textView而不是treeView):

textView = Gtk.TextView()
scrolledWindow = Gtk.ScrolledWindow()

def textViewChanged( self, widget ):
    adjustment = scrolledWindow.get_vadjustment()
    adjustment.set_value( adjustment.get_upper() - adjustment.get_page_size() )

textView.connect( "size-allocate", textViewChanged )

答案 4 :(得分:-1)

接受的答案帮助我找出了gtk-rs中的Rust解决方案,可以自动滚动到内容发布结束。

以下是可能帮助他人的Rust代码段:

// Imports used for reference
use gtk::{TextBuffer, TextView, TextBufferBuilder, ScrolledWindow, ScrolledWindowBuilder};

// The text buffer where the text is appended later
let text_buffer: TextBuffer = TextBufferBuilder::new().build();

// The containing text view that holds the text buffer
let text_view: TextView = TextView::new_with_buffer(&text_buffer);

// The scrolled window container with fixed height/width that holds the text view
let scrolled_window: ScrolledWindow = ScrolledWindowBuilder::new()
        .min_content_height(400)
        .min_content_width(600)
        .child(&text_view)
        .build();

// Have the text view connect to signal "size-allocate"
text_view.connect_size_allocate(clone!(@weak scrolled_window => move |_,_| {
   let adj = scrolled_window.get_vadjustment().unwrap();
   adj.set_value(adj.get_upper() - adj.get_page_size());
}));

// ...
// Later on, fill buffer with some text.
text_buffer.insert(&mut text_buffer.get_end_iter(), "This is my text I'm adding");