2016-02-13 79 views
1

我有一個GTK窗口設計如下我的窗口,的PyGTK 2:TreeView的是伸出甚至帶滾動條啓用

-Window 
    |- Scroll_Window 
    |- TreeView 

有了這個設計,我能夠看到垂直滾動窗口內的樹視圖滾動條已啓用。但問題是,樹視圖超出了我的視野。因此,如果使用箭頭鍵在樹視圖下進行操作,則樹視圖光標將不在視圖中(即沿實際滾動窗口向下)。

但是,如果我用我的鼠標滾動樹視圖,我能夠正確地看到我的樹視圖數據。

預期的行爲是按下按鈕,樹視圖應該自動滾動,光標總是可見的。

代碼:

import sys; 
import dbf, gtk, pygtk, gobject; 
pygtk.require('2.0'); 


w = gtk.Window(gtk.WINDOW_TOPLEVEL); 
w.set_title("TEST"); 
sw = gtk.ScrolledWindow(); 
sw.set_border_width(10); 
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC); 

treeView = gtk.TreeView(); 
listView = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING); 

inData = [["a","1"],["b","bb"],["c","cc"],["d","dd"],["e","ee"],["f","ff"],["g","gg"],["h","hh"],["i","ii"],["j","jj"],["k","kk"],["l","ll"],["n","nn"]]; 
for nameTinList in inData: 
    listIter = listView.append(); 
    listView.set_value(listIter, 0, nameTinList[0]); 
    listView.set_value(listIter, 1, nameTinList[1]); 

column = gtk.TreeViewColumn("Name", gtk.CellRendererText(), text=0); 
column.set_resizable(False); 
treeView.append_column(column); 
column = gtk.TreeViewColumn("DESC", gtk.CellRendererText(), text=1); 
column.set_resizable(False); 
treeView.append_column(column); 

treeView.set_model(listView); 
sw.add_with_viewport(treeView); 
w.add(sw); 
w.show_all(); 

gtk.main(); 
w.destroy(); 

輸出: enter image description here

+0

GTK + 2可能不會將部分可見行滾動到視圖中;這對於GTK + 2程序來說是正常的,但對於Windows程序來說是不常見的。 GTK + 3修復了這種行爲。我不確定如何在GTK + 2中解決這個問題;抱歉。 – andlabs

+0

我希望解決方案應該也適用於gtk2 +,因爲有很多應用程序在這個滾動窗口中運行 – Ashwin

+1

@andlabs在OP的示例中,使用鍵盤滾動根本不起作用,而不僅僅用於部分可見行。這對於GTK 2來說絕對不是正常的,並且是不正確使用'add_with_viewport'的結果(通過比較工作示例發現的)。 – user4815162342

回答

2

更換sw.add_with_viewport(treeView)sw.add(treeView),並與鍵盤滾動將正常工作。

由於the documentation狀態,add_with_viewport適用於沒有本機滾動功能的子窗口小部件。對於實現滾動的小部件,如gtk.TextViewgtk.TreeView,應使用add方法(從gtk.Container繼承)。