Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GTK3-Python树视图过滤器函数_Python_Python 3.x_Treeview_Gtk3_Treestore - Fatal编程技术网

GTK3-Python树视图过滤器函数

GTK3-Python树视图过滤器函数,python,python-3.x,treeview,gtk3,treestore,Python,Python 3.x,Treeview,Gtk3,Treestore,我有一个带有treeview和treestore的简单GTK3GUI。我需要用data3字符串过滤列,并仅显示data3行。但它也隐藏了data3行。因为data3列的父行也被隐藏 当我使用returnmodel[iter][2]==“data2”而不是returnmodel[iter][2]==“data3”时,它可以工作 所有行都可以通过注释掉这一行来查看:filter1.set\u visible\u func(filter1\u func) 我怎样才能解决这个问题 简化代码: impor

我有一个带有treeview和treestore的简单GTK3GUI。我需要用
data3
字符串过滤列,并仅显示
data3
行。但它也隐藏了
data3
行。因为
data3
列的父行也被隐藏

当我使用
returnmodel[iter][2]==“data2”
而不是
returnmodel[iter][2]==“data3”
时,它可以工作

所有行都可以通过注释掉这一行来查看:
filter1.set\u visible\u func(filter1\u func)

我怎样才能解决这个问题

简化代码:

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

builder = Gtk.Builder()
builder.add_from_file('test.glade')
builder.get_objects()
window1 = builder.get_object('window1')
treeview1 = builder.get_object('treeview1')

class Signals:
    def on_window1_destroy(self, widget):
        Gtk.main_quit()

def filter1_func(model, iter, data):
    return model[iter][2] == "data3"

list_data = [["text1", "data1", "data2"], ["text2", "data1", "data2"], ["text3", "data1", "data3"]]

treestore1 = Gtk.TreeStore(str, str, str)
piter1 = treestore1.append(None, list_data[0])
piter2 = treestore1.append(piter1, list_data[1])
piter3 = treestore1.append(piter1, list_data[2])

treeview1.set_model(treestore1)
filter1 = treestore1.filter_new()
filter1.set_visible_func(filter1_func)
filter1.refilter()

for i, column_title in enumerate(["col1", "col2", "col3"]):
    renderer = Gtk.CellRendererText()
    column = Gtk.TreeViewColumn(column_title, renderer, text=i)
    treeview1.append_column(column)

treeview1.set_model(filter1)
treeview1.expand_all()

builder.connect_signals(Signals())
window1.show_all()
Gtk.main()

您是否尝试过最后一个示例中的方法

示例中使用了带有liststore的treeview,并使用带有liststore筛选器的函数更新treeview。您可以尝试根据需要修改代码(treeview with treestore)


注意:它是用于liststore的。我不知道它是否适用于liststore的treeview。您可以尝试通过更新整个模型来使用treestore更新您的treeview,但这可能会耗费大量计算。

据我所知,没有办法抛弃父母而留下孩子。既不在GTK中,也不在Qt中。看不见的父母意味着所有孩子都看不见。我能提供的第一件事是非常明显的:与家长的可见性达成一致:)第二件事是展平您的模型。第二种方法是让TreeStore和ListStore在用户应用过滤时动态更新视图的模型。第四个要困难得多:子类GtkTreeModel,如果分别设置或未设置过滤,它将提供一个列表或项目树。@Alexander Dmitriev,oduncu90用户在第一个答案中建议了一个示例(在页面末尾)。但我不是程序员,也不太擅长Python编程。对我来说,这是一个复杂的例子。当我执行示例中的孔代码时,它会起作用。我不知道你是以什么方式提供的。哦,那可能是必要的。Gtk有
ListStore
TreeStore
。树具有层次结构:行可以有子节点,子节点也可以有子节点。列表是一个项目列表,所有项目都处于同一级别,没有家长,也没有孩子。如果Treeview过滤器演示的外观适合您的数据集,只需使用它,您的代码就可以正常工作。顺便说一句,TreeStore可以像ListStore一样使用,如果没有任何项具有父节点。此调用:
piter2=treestore1.append(piter1…
生成一个新行,父级为
piter1
。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效-