我在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
?
答案 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上的原始帖子:
答案 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");