5

Gtk TreeView (GTK3 の Python バインディング) の列の 1 つで、ファイルの読み込みや色の表示に問題があります。QGIS の例では、最初の行にアイコンが表示され、2 行目に青い円が表示されます。色はレイヤー プロパティから取得されます。

ここに画像の説明を入力

私のコードは次のようになりますが、同じディレクトリに 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 の古い例はここにありますが、これの処理方法が実際に変更されています。

4

3 に答える 3

7

この問題は PyGTK2.0 と同様に解決できます。1 つのオブジェクトにCellRendererTextとの 2 つのオブジェクトをアタッチCellRendererPixbufし、列のメソッドをTreeViewColumn呼び出してセルのデータ リターン関数を設定する必要があります。これは非常に複雑です(以下のコードを参照):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のドキュメントを使用し、PyGTKのバージョン3で役立つPyGTK2.0の特別なプロパティTreeViewColumn.set_cell_data_funcに関する重要なページを読むことができます:)CellRenderers

于 2015-01-08T22:10:27.180 に答える
2

どうやら私が見逃していたのは、pixbufが0列目にあることを示す「pixbuf = 0」だけでした。例の次の行を変更する必要があります。

    px_column = Gtk.TreeViewColumn("Icon", px_renderer, pixbuf=0)
于 2015-01-13T11:09:49.137 に答える