2011-03-07 59 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