如何自动滚动 gtk.scrolledwindow?

24 投票
6 回答
11051 浏览
提问于 2025-04-16 13:09

我在一个叫做ScrolledWindow的窗口里放了一个树形视图(treeview-widget),这个树形视图是在程序运行时动态填充数据的。我希望这个ScrolledWindow能自动滚动到列表的底部。为了解决这个问题,我每次往树形视图里插入一行数据时,就调整ScrolledWindowvadjustment(垂直调整值)。比如:

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

如果我在交互式的ipython环境中运行这段代码,并自己手动设置这个值,一切都能正常工作。

但是如果我用默认的python解释器来运行这段代码,自动滚动就不总是有效。我调试了一下代码,发现问题似乎是调整值有点“延迟”,只有在过了一段时间后才会改变。

我想问的是:怎样才能可靠地滚动到ScrolledWindow的最大位置?有没有什么特殊的信号可以使用?或者有没有更好的方法来设置adjustment-value

6 个回答

8

这是关于Python和Gtk 3的内容。

这行代码的意思是:把一个叫做“adj”的东西的值设置为“adj”能获取的最大值减去“adj”能获取的页面大小。

简单来说,就是在调整某个东西的值,让它等于最大的可能值减去当前显示的内容大小。

8

fookatchu的回答可以改进一下,这样回调函数就可以被多个小部件使用了:

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

在我扩大搜索范围后,发现了一个和Ruby相关的答案。因为这个问题和gtk有关,所以用任何语言都可以解决,方法大致是这样的:

你需要把那个会变化的组件,比如说树视图(treeview),连接到gtk.widget的“size-allocate”信号上,然后把gtk.scrolledwindow的值设置为“上边界 - 页面大小”。举个例子:

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的链接:

提示提示

撰写回答