2015-01-02 4 views
2

Gtk TreeView (GTK3의 Python 바인딩) 중 하나의 열에 파일을로드하거나 색상을 표시하는 데 문제가 있습니다. 예를 들어 QGIS에서 가져온 첫 번째 행에는 아이콘이 표시되고 두 번째 행에는 파란색 원이 표시됩니다. 색상은 레이어 속성에서 가져옵니다 :Gtk TreeView 트리의 아이콘 또는 색상 표시

enter image description here

내 코드는 다음과 같이 보이지만 같은 디렉토리에 icon.png 파일을로드하지 않습니다

#!/usr/bin/python3 
from gi.repository import Gtk, Gdk, GdkPixbuf 

class MyWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self) 
     self.set_default_size(200, 200) 

     self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, str) 
     self.treeview = Gtk.TreeView(model=self.liststore) 

     symbol1 = GdkPixbuf.Pixbuf.new_from_file("icon.png") 
     self.liststore.append([symbol1, "This is a symbol1"]) 

     symbol2 = Gtk.IconTheme.get_default().load_icon("gtk-cut", 64, 0) 
     self.liststore.append([symbol2, "This is symbol2"]) 

     px_renderer = Gtk.CellRendererPixbuf() 
     px_column = Gtk.TreeViewColumn("Icon", px_renderer) 
     self.treeview.append_column(px_column) 

     str_renderer = Gtk.CellRendererText() 
     str_column = Gtk.TreeViewColumn("Name", str_renderer, text=1) 
     self.treeview.append_column(str_column) 

     self.add(self.treeview) 

win = MyWindow() 
win.connect("delete-event", Gtk.main_quit) 
win.show_all() 
Gtk.main() 

이 GTK3의 pixbuf에 대한 문서입니다 여기 :

PyGTK에 대한 17,451,515,

이전 예제는 여기에 있습니다,하지만 뭔가 정말이 처리하는 방법으로 변경되었습니다

답변

4

이 문제는 PyGTK2.0 유사한 해결할 수 있습니다, 당신은 필요 TreeViewColumn의 한 객체에 CellRendererText 및 CellRendererPixbuf의 두 객체를 연결 한 다음 을 호출합니다. set_cell_data_func 열을 설정하는 방법 데이터 반환 자 기능 세포 에스. 이 복잡한 작은입니다 (코드 아래 참조)

from gi.repository import Gtk, Gdk, GdkPixbuf 

class MyWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self) 
     self.set_default_size(200, 200) 

     self.liststore = Gtk.ListStore(str, str) 
     self.treeview = Gtk.TreeView(model=self.liststore) 

     self.liststore.append(["icon.png", "This is a symbol1"]) 

     px_renderer = Gtk.CellRendererPixbuf() 
     px_column = Gtk.TreeViewColumn('') 
     px_column.pack_start(px_renderer, False) 
     str_renderer = Gtk.CellRendererText() 
     px_column.pack_start(str_renderer, False) 
     # set data connector function/method 
     px_column.set_cell_data_func(px_renderer, self.get_tree_cell_pixbuf) 
     px_column.set_cell_data_func(str_renderer, self.get_tree_cell_text) 
     self.treeview.append_column(px_column) 

     self.add(self.treeview) 

    def get_tree_cell_text(self, col, cell, model, iter, user_data): 
     cell.set_property('text', model.get_value(iter, 1)) 

    def get_tree_cell_pixbuf(self, col, cell, model, iter, user_data): 
     cell.set_property('pixbuf', GdkPixbuf.Pixbuf.new_from_file(model.get_value(iter, 0))) 

if __name__ == '__main__': 
    win = MyWindow() 
    win.connect("delete-event", Gtk.main_quit) 
    win.show_all() 
    Gtk.main() 

당신이 pygtk2.0에 대한 TreeViewColumn.set_cell_data_func 방법의 문서를 사용하고 PyGTK의 버전 3에 유용 할 수 있습니다 중요한 페이지에 대한 CellRenderers 및 PyGTK2.0의 특별한 속성을 읽을 수 있습니다 :)

+0

이 예제를 이용해 주셔서 감사합니다. 나는 이제 내 실수를 알아 냈다. – tobias47n9e

+0

감사합니다. – Mohsen

0

분명히 나는 ​​pixbuf가 0 번째 열에 있음을 나타내는 "pixbuf = 0"이 누락되었습니다. 이 예의 예제는 수정해야합니다 :

px_column = Gtk.TreeViewColumn("Icon", px_renderer, pixbuf=0)