通过弹出菜单添加列GtkTreeView

时间:2016-08-29 16:14:50

标签: python python-3.x gtk gtk3

通过单击GtkTreeView的任何列标题,我想打开一个带有选择项的弹出菜单,用户可以在运行时添加或删除列。 下面我有一个普通的GtkTreeView的例子。如何向其添加此功能?

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class TreeModelSort(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_default_size(200, -1)
        self.connect("destroy", Gtk.main_quit)

        liststore = Gtk.ListStore(str)
        liststore.append(["Mark"])
        liststore.append(["Chris"])
        liststore.append(["Tim"])
        liststore.append(["David"])
        liststore.append(["Keith"])
        liststore.append(["Mark"])

        treemodelsort = Gtk.TreeModelSort(liststore)
        treemodelsort.set_sort_column_id(0, Gtk.SortType.ASCENDING)

        treeview = Gtk.TreeView()
        treeview.set_model(treemodelsort)
        self.add(treeview)

        cellrenderertext = Gtk.CellRendererText()
        treeviewcolumn = Gtk.TreeViewColumn("Name", cellrenderertext, text=0)
        treeview.append_column(treeviewcolumn)

window = TreeModelSort()
window.show_all()

Gtk.main()

1 个答案:

答案 0 :(得分:0)

猜想我对OP做出响应还为时已晚,但这可能会在整个SEO中帮助其他人。

目前,GTK3仍是最常用的版本,而GTK4仍在开发中。至此,GTK + 不支持通过第一手方法“实时”添加列。也就是说,在使用给定数量的列类型进行初始化之后,它不支持在树视图模型(在您的情况下为GtkListStore)中添加列,但是您可以在GtkTreeViewColumn的{​​{1}}对象中插入GtkTreeView对象任何时候。如GtkListStore的GTK C参考页中所述,函数gtk_list_store_set_column_types()

  

此函数主要用于继承自的GObject   GtkListStore,并且仅应在构造新的   GtkListStore。添加一行后,或   GtkTreeModel接口上的方法被调用。

您可以创建具有旧类型和新列类型的新列表存储,复制行数据,然后调用treeview方法使用该列表存储。 在C语言中,我利用了以下功能:g_object_set_data()g_object_get_data()gtk_list_store_newv(),您可以阅读并学习它们的用途以及在哪里可能有用。不要忘记用适当的渲染器包装新的GtkTreeViewColumn并设置其属性(列数)。