如何自动滚动gtk.scrolledwindow?

问题描述 投票:20回答:4

我有一个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?

python gtk pygtk gtktreeview scrolledwindow
4个回答
26
投票

在扩大搜索半径后,我发现了一个与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的原始帖子。

提示提示


8
投票

fookatchu的回答可以改进,以便回调可以被多个widget使用。

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

7
投票

Python Gtk 3版本。

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


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 )

0
投票

接受的答案帮助我在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");
© www.soinside.com 2019 - 2024. All rights reserved.