PyGTK - Lớp TreeView
Tiện ích Treeview hiển thị nội dung của một mô hình triển khai giao diện gtk.TreeModel. PyGTK cung cấp các loại mô hình sau:
- gtk.ListStore
- gtk.TreeStore
- gtk.TreeModelSort
ListStore là một mô hình danh sách. Khi được liên kết với một widget gtk.TreeView, nó tạo ra một hộp Danh sách chứa các mục sẽ được chọn. Một đối tượng gtk.ListStore được khai báo với cú pháp sau:
store = gtk.ListStore(column_type)
Một danh sách có thể có nhiều cột, các hằng số kiểu được xác định trước là -
- 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, v.v.
Ví dụ, một đối tượng ListStore để lưu trữ các mục chuỗi được khai báo là:
store = gtk.ListStore(gobject.TYPE_STRING
Để thêm các mặt hàng trong cửa hàng, phương thức append () được sử dụng:
store.append (["item 1"])
TreeStore là một mô hình cho tiện ích Cây nhiều cột. Ví dụ, câu lệnh sau đây tạo một cửa hàng với một cột có mục chuỗi.
Store = gtk.TreeStore(gobject.TYPE_STRING)
Để thêm các mục trong TreeStore, hãy sử dụng phương thức append (). Phương thức append () có hai tham số, cha và hàng. Để thêm mục cấp cao nhất, cấp độ gốc là Không có.
row1 = store.append(None, ['row1'])
Bạn cần lặp lại câu lệnh này để thêm nhiều hàng.
Để thêm các hàng con, hãy chuyển hàng cấp trên làm tham số chính cho phương thức append () -
childrow = store.append(row1, ['child1'])
Bạn cần lặp lại câu lệnh này để thêm nhiều hàng con.
Bây giờ, tạo một widget TreeView và sử dụng đối tượng TreeStore ở trên làm mô hình.
treeview = gtk.TreeView(store)
Bây giờ chúng ta phải tạo TreeViewColumn để hiển thị dữ liệu cửa hàng. Đối tượng của gtk.TreeViewColumn quản lý tiêu đề và các ô bằng gtk.CelRenderer. Đối tượng TreeViewColumn được tạo bằng cách sử dụng hàm tạo sau:
gtk.TreeViewColumn(title, cell_renderer,…)
Ngoài tiêu đề và trình kết xuất, cần không hoặc nhiều cặp thuộc tính = cột để chỉ định cột của mô hình cây mà giá trị của thuộc tính sẽ được truy xuất. Các tham số này cũng có thể được thiết lập bằng các phương thức của lớp TreeViewColumn được đưa ra bên dưới.
Gtk.CellRenderer là một lớp cơ sở cho một tập hợp các đối tượng để hiển thị các kiểu dữ liệu khác nhau. Các lớp dẫn xuất là CellRendererText, CellRendererPixBuf và CellRendererToggle.
Các phương thức sau của lớp TreeViewColumn được sử dụng để định cấu hình đối tượng của nó:
TreeViewColumn.pack_start (ô, expand = True) - Phương thức này gói đối tượng CellRenderer vào cột đầu. Nếu tham số mở rộng được đặt thành True, toàn bộ không gian được phân bổ của cột sẽ được gán cho ô.
TreeViewColumn.add_attribute (ô, thuộc tính, cột) - Phương thức này thêm một ánh xạ thuộc tính vào danh sách trong cột cây. Cáccolumn là cột của mô hình cây.
TreeViewColumn.set_attributes () - Phương thức này đặt các vị trí thuộc tính của renderer sử dụng attribute = column cặp
TreeViewColumn.set_visible () - Nếu True, cột chế độ xem cây có thể nhìn thấy
TreeViewColumn.set_title () - Phương thức này đặt thuộc tính "title" thành giá trị được chỉ định.
TreeViewColumn.set_lickable () - Nếu được đặt thành True, tiêu đề có thể lấy tiêu điểm bàn phím và được nhấp vào.
TreeViewColumn.set_alignment (xalign) - Phương thức này đặt thuộc tính "alignment" thành giá trị của xalign.
Các "nhấp vào" tín hiệu được phát ra khi người dùng nhấp vào treeviewcolumn nút tiêu đề.
Sau khi đã định cấu hình đối tượng TreeViewColumn, đối tượng này sẽ được thêm vào tiện ích TreeView bằng phương thức append_column ().
Sau đây là các phương thức quan trọng của lớp TreeView:
TreevVew.set_model () - Điều này đặt thuộc tính "model" cho chế độ xem dạng cây. Nếu chế độ xem dạng cây đã có một bộ mô hình, phương pháp này sẽ loại bỏ nó trước khi thiết lập mô hình mới. Nếumodel Là None, nó sẽ hủy thiết lập mô hình cũ.
TreeView.set_header_clickable () - Nếu được đặt thành True, bạn có thể nhấp vào các nút tiêu đề cột.
TreeView.append_column () - Điều này nối với các TreeViewColumn vào danh sách các cột.
TreeView.remove_column () - Thao tác này xóa cột được chỉ định khỏi chế độ xem dạng cây.
TreeView.insert_column () - Điều này sẽ chèn các column vào chế độ xem dạng cây tại vị trí được chỉ định bởi position.
Tiện ích TreeView phát ra các tín hiệu sau:
con trỏ đã thay đổi | Điều này được phát ra khi con trỏ di chuyển hoặc được đặt. |
mở rộng-thu gọn-con trỏ-hàng | Điều này được phát ra khi hàng tại con trỏ cần được mở rộng hoặc thu gọn. |
kích hoạt hàng | Điều này được phát ra khi người dùng nhấp đúp vào treeview hàng |
đã thu gọn hàng | Điều này được phát ra khi một hàng được thu gọn bởi người dùng hoặc hành động có lập trình. |
mở rộng hàng | Điều này được phát ra khi một hàng được mở rộng thông qua người dùng hoặc hành động có lập trình. |
Hai ví dụ về tiện ích TreeView được đưa ra dưới đây. Ví dụ đầu tiên sử dụng ListStore để tạo một ListView đơn giản.
Tại đây một đối tượng ListStore được tạo và các mục chuỗi được thêm vào nó. Đối tượng ListStore này được sử dụng làm mô hình cho đối tượng TreeView -
store = gtk.ListStore(str)
treeView = gtk.TreeView()
treeView.set_model(store)
Sau đó, một CellRendererText được thêm vào một đối tượng TreeViewColumn và đối tượng tương tự được thêm vào TreeView.
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Name", rendererText, text = 0)
treeView.append_column(column)
TreeView Object được đặt trên cửa sổ toplevel bằng cách thêm nó vào vùng chứa Cố định.
ví dụ 1
Quan sát đoạn mã sau:
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()
Mục do người dùng chọn được hiển thị trên nhãn trong cửa sổ dưới dạng on_activated callback hàm được gọi.
Ví dụ 2
Ví dụ thứ hai xây dựng một TreeView phân cấp từ một TreeStore. Chương trình này tuân theo cùng một trình tự xây dựng cửa hàng, đặt nó làm mô hình cho TreeView, thiết kế TreeViewColumn và gắn nó vào 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 sau được hiển thị dưới dạng đầu ra: