21

我在 a 中有一个 treeview-widget ScrolledWindow,它在运行时填充。我希望ScrolledWindow自动滚动到列表的末尾。我“解决”了这个问题,通过调整vadjustmentScrolledWindow每次将一行插入到树视图中。例如:

if new_line_in_row:
   adj = self.scrolled_window.get_vadjustment()
   adj.set_value( adj.upper - adj.page_size )

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

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

我的问题是:如何可靠地滚动到ScrolledWindow? 是否生成了我可以使用的特殊信号?还是有更好的方法来设置adjustment-value

4

6 回答 6

29

扩大搜索范围后,我找到了与 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 上的原始帖子:

提示提示

于 2011-03-08T16:34:13.063 回答
8

Python Gtk 3 版本:

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

于 2014-12-16T01:10:24.337 回答
8

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

def treeview_changed( self, widget, event, data=None ):
    adj = widget.get_vadjustment()
    adj.set_value( adj.upper - adj.pagesize )
于 2012-01-15T06:52:55.820 回答
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");
于 2020-06-20T20:17:07.820 回答
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 )
于 2020-04-25T12:16:44.570 回答
0

建议的解决方案都不适合我,但我能够获得所需的行为(使用Go 的GTk4绑定):

adj := scrolledWindow.VAdjustment()
adj.SetUpper(adj.Upper() + adj.PageSize())
adj.SetValue(adj.Upper())

其他解决方案会将滚动窗口(我的包含一个列表框)向下移动到倒数第二个项目,但不显示最后一个项目。它的行为方式让我认为需要增加上限,所以我尝试通过页面大小增加它,然后将滚动值设置为新的上限。

于 2022-02-18T20:45:27.990 回答