2011-03-07 82 views
17

我在运行期间填充的ScrolledWindow内有一个treeview-widget。我希望ScrolledWindow自动滚动到列表的末尾。我通过调整ScrolledWindowvadjustment“解决”了问题,每次将一行插入到树视图中。例如:如何自动滚动gtk.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

+2

好问题。我很想知道这一点。它出来了[这个问题],我甚至提供了一个150的赏金,但没有得到我希望的答案(http://stackoverflow.com/questions/2659026/painting-on-gtkscrolledwindow-or-gtkeventbox) 。 – ptomato 2011-03-07 22:05:27

回答

19

扩大我的搜索半径后,我发现了一个红宝石相关的答案。因为问题是gtk相关的,它应该能够用任何语言解决,如下所示:

你连接的widget改变,在我的情况下树视图,与gtk.widget的'大小分配'信号和设置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:

hint hint

+5

成员变量现在似乎隐藏起来了。使用get_upper()和get_page_size()代替 – Fookatchu 2013-10-31 09:57:29

7

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

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

的Python的Gtk 3版本:

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

+0

这不适用于例如。 gtk.treeview:'adj'的值稍后更新,所以大多数情况下,最后添加的行不会出现。 – jcoppens 2017-07-13 15:19:27