我正在使用类似上面的 Gtk3 TreeView。该模型是一个 Gtk.TreeStore

  • Gtk.TreeStore(str, GdkPixbuf.Pixbuf)

  • 对于图片,我可以通过以下方式将正确大小的图像添加到模型中:
  • pixbuf.scale_simple(48,48,GdkPixbuf.InterpType.BILINEAR)

  • 但是,我也在其他地方使用模型以不同的方式显示 pixbuf,并且 pixbuf 也可以是各种大小。

    我想做的是强制在运行时显示图片的大小。问题是 - 我该怎么做?

    我尝试强制 GtkCellRendererPixbuf 为固定大小,但这仅显示正确大小的图像 - 但仅显示与固定大小相对应的图像部分
    pixbuf = Gtk.CellRendererPixbuf()
    pixbuf.set_fixed_size(48,48)
    

    我想到了使用TreeViewColumn的set_cell_data_func:
    col = Gtk.TreeViewColumn('', pixbuf, pixbuf=1)
    col.set_cell_data_func(pixbuf, self._pixbuf_func, None)
    
    def _pixbuf_func(self, col, cell, tree_model, tree_iter, data):
        cell.props.pixbuf = cell.props.pixbuf.scale_simple(48,48,GdkPixbuf.InterpType.BILINEAR)
    

    这确实在运行时动态调整图像大小 - 但在终端中我收到数百个错误,例如:
    sys:1: RuntimeWarning: Expecting to marshal a borrowed reference for <Pixbuf object at 0x80acbe0 (GdkPixbuf at 0x87926d0)>, but nothing in Python is holding a reference to this object. See: https://bugzilla.gnome.org/show_bug.cgi?id=687522
    

    我还通过调整 treemodel pixbuf 而不是 cell.props.pixbuf 的大小来尝试替代方案,但这也会产生与上述相同的错误。
    cell.props.pixbuf = tree_model.get_value(tree_iter,1).scale_simple(48,48,GdkPixbuf.InterpType.BILINEAR)
    

    很明显,这不是正确的做法 - 那么有什么想法可以解决这个问题吗?任何指向基于 Gtk3 的 C++/Python 示例代码的链接都是最受欢迎的。

    我正在使用 Gtk+3.6/python 2.7

    最佳答案

    老问题,但遗憾的是仍然相关 - Gtk 中的这个错误仍然存​​在。幸运的是,有一个非常简单的解决方法。您需要做的就是保留对缩放后的 pixbuf 的引用。

    我已经改变了 _pixbuf_func 函数,以便它接受一个字典,在其中存储小 pixbuf。这消除了烦人的警告消息,并且还可以防止每次调用 _pixbuf_func 时都缩小 pixbuf。

    def pixbuf_func(col, cell, tree_model, tree_iter, data):
        pixbuf= tree_model[tree_iter][1] # get the original pixbuf from the TreeStore. [1] is
                                         # the index of the pixbuf in the TreeStore.
        try:
            new_pixbuf= data[pixbuf] # if a downscaled pixbuf already exists, use it
        except KeyError:
            new_pixbuf= pixbuf.scale_simple(48,48,GdkPixbuf.InterpType.BILINEAR)
            data[pixbuf]= new_pixbuf # keep a reference to this pixbuf to prevent Gtk warning
                                     # messages
        cell.set_property('pixbuf', new_pixbuf)
    
    renderer = Gtk.CellRendererPixbuf()
    col = Gtk.TreeViewColumn('', renderer)
    col.set_cell_data_func(renderer, pixbuf_func, {}) # pass a dict to keep references in
    

    此解决方案的一个问题是,每当 TreeStore 的内容发生更改时,您都必须从 dict 中删除存储的 Pixbuf,否则它们将永远存在并且您的程序将消耗不必要的内存。

    关于python - 如何在树 View 中动态调整 pixbuf cellrenderer 的大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19778003/

    10-09 16:52