我有一个treeview-widget在一个 ScrolledWindow
,它在运行时被填充。我想让 ScrolledWindow
来自动滚动到列表的最后。我 "解决 "了这一问题,通过调节 vadjustment
的 ScrolledWindow
每当有一行插入到树状视图中时,就会出现一个新的值,例如
if new_line_in_row:
adj = self.scrolled_window.get_vadjustment()
adj.set_value( adj.upper - adj.page_size )
如果我在一个交互式的ipython会话中运行这段代码,并自己设置值,一切都能正常工作。
如果我用默认的python解释器运行这段代码,自动滚动并不是一直在工作。我对代码进行了调试,问题似乎是,调整值有某种 "滞后",只有在一段时间后才会改变。
我的问题是:我如何可靠地滚动到最大的位置?ScrolledWindow
是一个特殊的信号生成,我可以使用吗? 或者有一个更好的方式来设置 adjustment-value
?
在扩大搜索半径后,我发现了一个与ruby相关的答案。因为这个问题是与gtk相关的,所以应该可以用任何语言解决。
你把改变的widget连接起来, 在我的例子中是treeeview, 与 gtk.widget
的'大小分配'信号,并设置了 gtk.scrolledwindow
值为 "uperior - 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的原始帖子。
fookatchu的回答可以改进,以便回调可以被多个widget使用。
def treeview_changed( self, widget, event, data=None ):
adj = widget.get_vadjustment()
adj.set_value( adj.upper - adj.pagesize )
Python Gtk 3版本。
adj.set_value(adj.get_upper() - adj.get_page_size())
仍然需要回调(我用的是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 )
接受的答案帮助我在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");