- PyGTK 教程
- PyGTK - 首頁
- PyGTK - 簡介
- PyGTK - 環境配置
- PyGTK - Hello World
- PyGTK - 重要類
- PyGTK - 視窗類 (Window Class)
- PyGTK - 按鈕類 (Button Class)
- PyGTK - 標籤類 (Label Class)
- PyGTK - 輸入框類 (Entry Class)
- PyGTK - 訊號處理
- PyGTK - 事件處理
- PyGTK - 容器
- PyGTK - 箱式容器類 (Box Class)
- PyGTK - 按鈕盒類 (ButtonBox Class)
- PyGTK - 對齊類 (Alignment Class)
- PyGTK - 事件盒類 (EventBox Class)
- PyGTK - 佈局類 (Layout Class)
- PyGTK - 組合框類 (ComboBox Class)
- PyGTK - 切換按鈕類 (ToggleButton Class)
- PyGTK - 複選框類 (CheckButton Class)
- PyGTK - 單選按鈕類 (RadioButton Class)
- PyGTK - 選單欄、選單和選單項 (MenuBar, Menu & MenuItem)
- PyGTK - 工具欄類 (Toolbar Class)
- PyGTK - 調整器類 (Adjustment Class)
- PyGTK - 範圍類 (Range Class)
- PyGTK - 刻度類 (Scale Class)
- PyGTK - 捲軸類 (Scrollbar Class)
- PyGTK - 對話方塊類 (Dialog Class)
- PyGTK - 訊息對話方塊類 (MessageDialog Class)
- PyGTK - 關於對話方塊類 (AboutDialog Class)
- PyGTK - 字型選擇對話方塊
- PyGTK - 顏色選擇對話方塊
- PyGTK - 檔案選擇對話方塊
- PyGTK - 筆記本類 (Notebook Class)
- PyGTK - 框架類 (Frame Class)
- PyGTK - 帶比例的框架類 (AspectFrame Class)
- PyGTK - TreeView 類
- PyGTK - 分割窗格類 (Paned Class)
- PyGTK - 狀態列類 (Statusbar Class)
- PyGTK - 進度條類 (ProgressBar Class)
- PyGTK - 視口類 (Viewport Class)
- PyGTK - 滾動視窗類 (Scrolledwindow Class)
- PyGTK - 箭頭類 (Arrow Class)
- PyGTK - 圖片類 (Image Class)
- PyGTK - 繪圖區類 (DrawingArea Class)
- PyGTK - 旋轉按鈕類 (SpinButton Class)
- PyGTK - 日曆類 (Calendar Class)
- PyGTK - 剪貼簿類 (Clipboard Class)
- PyGTK - 標尺類 (Ruler Class)
- PyGTK - 超時 (Timeout)
- PyGTK - 拖放
- PyGTK 有用資源
- PyGTK - 快速指南
- PyGTK - 有用資源
- PyGTK - 討論
PyGTK - TreeView 類
TreeView 小部件顯示實現 gtk.TreeModel 介面的模型的內容。PyGTK 提供以下型別的模型:
- gtk.ListStore
- gtk.TreeStore
- gtk.TreeModelSort
ListStore 是一個列表模型。當與 gtk.TreeView 小部件關聯時,它會生成一個列表框,其中包含要從中選擇的專案。gtk.ListStore 物件使用以下語法宣告:
store = gtk.ListStore(column_type)
列表可以有多個列,預定義的型別常量為:
- gobject.TYPE_BOOLEAN
- gobject.TYPE_BOXED
- gobject.TYPE_CHAR
- gobject.TYPE_DOUBLE
- gobject.TYPE_ENUM
- gobject.TYPE_FLOAT
- gobject.TYPE_INT
- gobject.TYPE_LONG
- gobject.TYPE_NONE
- gobject.TYPE_OBJECT
- gobject.TYPE_STRING
- gobject.TYPE_UCHAR
- gobject.TYPE_UINT
- gobject.TYPE_ULONG
- gtk.gdk.pixbuf 等。
例如,宣告一個用於儲存字串專案的 ListStore 物件:
store = gtk.ListStore(gobject.TYPE_STRING
為了向儲存區新增專案,使用 append() 方法:
store.append (["item 1"])
TreeStore 是多列樹形小部件的模型。例如,以下語句建立一個只有一個列(包含字串項)的儲存區。
Store = gtk.TreeStore(gobject.TYPE_STRING)
為了向 TreeStore 新增專案,使用 append() 方法。append() 方法有兩個引數,parent 和 row。要新增頂級專案,parent 為 None。
row1 = store.append(None, ['row1'])
需要重複此語句以新增多行。
為了新增子行,將頂級行作為 parent 引數傳遞給 append() 方法:
childrow = store.append(row1, ['child1'])
需要重複此語句以新增多個子行。
現在,建立一個 TreeView 小部件並使用上面的 TreeStore 物件作為模型。
treeview = gtk.TreeView(store)
現在我們必須建立 TreeViewColumn 來顯示儲存資料。gtk.TreeViewColumn 的物件使用 gtk.CelRenderer 管理標題和單元格。TreeViewColumn 物件使用以下建構函式建立:
gtk.TreeViewColumn(title, cell_renderer,…)
除了標題和渲染器之外,它還接受零個或多個 attribute=column 對,以指定從哪個樹模型列檢索屬性的值。這些引數也可以使用下面給出的 TreeViewColumn 類的使用方法來設定。
gtk.CellRenderer 是用於渲染不同型別資料的物件集的基類。派生類包括 CellRendererText、CellRendererPixBuf 和 CellRendererToggle。
TreeViewColumn 類的以下方法用於配置其物件:
TreeViewColumn.pack_start(cell, expand = True) - 此方法將 CellRenderer 物件打包到列的開頭。如果 expand 引數設定為 True,則列的整個分配空間將分配給單元格。
TreeViewColumn.add_attribute(cell, attribute, column) - 此方法將屬性對映新增到樹列中的列表。column 是樹模型的列。
TreeViewColumn.set_attributes() - 此方法使用attribute = column 對設定renderer 的屬性位置。
TreeViewColumn.set_visible() - 如果為True,則 treeview 列可見。
TreeViewColumn.set_title() - 此方法將“標題”屬性設定為指定的值。
TreeViewColumn.set_clickable() - 如果設定為 True,則標題可以獲取鍵盤焦點並被單擊。
TreeViewColumn.set_alignment(xalign) - 此方法將“對齊”屬性設定為xalign 的值。
當用戶單擊treeviewcolumn 標題按鈕時,將發出“clicked”訊號。
配置 TreeViewColumn 物件後,可以使用 append_column() 方法將其新增到 TreeView 小部件。
以下是 TreeView 類的重要方法:
TreeView.set_model() - 這將設定 treeview 的“model”屬性。如果 treeview 已經設定了模型,則此方法將在設定新模型之前將其刪除。如果model 為None,它將取消設定舊模型。
TreeView.set_header_clickable() - 如果設定為 True,則可以單擊列標題按鈕。
TreeView.append_column() - 這會將指定的TreeViewColumn 附加到列列表。
TreeView.remove_column() - 這會從 treeview 中刪除指定的列。
TreeView.insert_column() - 這會將指定的column 插入到 treeview 中,位置由position 指定。
TreeView 小部件發出以下訊號:
| cursor-changed | 當游標移動或設定時發出此訊號。 |
| expand-collapse-cursor-row | 當需要展開或摺疊游標處的行時發出此訊號。 |
| row-activated | 當用戶雙擊treeview 行時發出此訊號。 |
| row-collapsed | 當用戶或程式操作摺疊行時發出此訊號。 |
| row-expanded | 當用戶或程式操作展開行時發出此訊號。 |
下面給出 TreeView 小部件的兩個示例。第一個示例使用 ListStore 生成簡單的 ListView。
這裡建立一個 ListStore 物件並將字串項新增到其中。此 ListStore 物件用作 TreeView 物件的模型:
store = gtk.ListStore(str) treeView = gtk.TreeView() treeView.set_model(store)
然後將 CellRendererText 新增到 TreeViewColumn 物件,並將其附加到 TreeView。
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Name", rendererText, text = 0)
treeView.append_column(column)
透過將其新增到 Fixed 容器,TreeView 物件放置在頂級視窗上。
示例 1
觀察以下程式碼:
import pygtk
pygtk.require('2.0')
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_title("TreeView with ListStore")
self.set_default_size(250, 200)
self.set_position(gtk.WIN_POS_CENTER)
store = gtk.ListStore(str)
store.append (["PyQt"])
store.append (["Tkinter"])
store.append (["WxPython"])
store.append (["PyGTK"])
store.append (["PySide"])
treeView = gtk.TreeView()
treeView.set_model(store)
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Python GUI Libraries", rendererText, text=0)
treeView.append_column(column)
fixed = gtk.Fixed()
lbl = gtk.Label("select a GUI toolkit")
fixed.put(lbl, 25,75)
fixed.put(treeView, 125,15)
lbl2 = gtk.Label("Your choice is:")
fixed.put(lbl2, 25,175)
self.label = gtk.Label("")
fixed.put(self.label, 125,175)
self.add(fixed)
treeView.connect("row-activated", self.on_activated)
self.connect("destroy", gtk.main_quit)
self.show_all()
def on_activated(self, widget, row, col):
model = widget.get_model()
text = model[row][0]
self.label.set_text(text)
def main():
gtk.main()
return
if __name__ == "__main__":
bcb = PyApp()
main()
使用者選擇的專案顯示在視窗中的標籤上,因為呼叫了on_activated 回撥函式。
示例 2
第二個示例從 TreeStore 構建分層的 TreeView。該程式遵循構建儲存區、將其設定為 TreeView 的模型、設計 TreeViewColumn 並將其附加到 TreeView 的相同順序。
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_title("TreeView with TreeStore")
self.set_size_request(400,200)
self.set_position(gtk.WIN_POS_CENTER)
vbox = gtk.VBox(False, 5)
# create a TreeStore with one string column to use as the model
store = gtk.TreeStore(str)
# add row
row1 = store.append(None, ['JAVA'])
#add child rows
store.append(row1,['AWT'])
store.append(row1,['Swing'])
store.append(row1,['JSF'])
# add another row
row2 = store.append(None, ['Python'])
store.append(row2,['PyQt'])
store.append(row2,['WxPython'])
store.append(row2,['PyGTK'])
# create the TreeView using treestore
treeview = gtk.TreeView(store)
tvcolumn = gtk.TreeViewColumn('GUI Toolkits')
treeview.append_column(tvcolumn)
cell = gtk.CellRendererText()
tvcolumn.pack_start(cell, True)
tvcolumn.add_attribute(cell, 'text', 0)
vbox.add(treeview)
self.add(vbox)
self.connect("destroy", gtk.main_quit)
self.show_all()
PyApp()
gtk.main()
以下 TreeView 顯示為輸出: