GTK-Python树视图以编程方式选择行
我有一个GTK3GUI(使用Python 3.7)。GUI上有一个树状视图,并使用排序、筛选。我需要使用代码选择一行。它在不使用排序时工作。单击列标题按钮使用排序时,它选择了错误的行 解决这个问题的办法是什么 以下是简化代码:GTK-Python树视图以编程方式选择行,python,python-3.x,treeview,gtk,gtk3,Python,Python 3.x,Treeview,Gtk,Gtk3,我有一个GTK3GUI(使用Python 3.7)。GUI上有一个树状视图,并使用排序、筛选。我需要使用代码选择一行。它在不使用排序时工作。单击列标题按钮使用排序时,它选择了错误的行 解决这个问题的办法是什么 以下是简化代码: import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk builder = Gtk.Builder() builder.add_from_file('test1.glade') w
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
builder = Gtk.Builder()
builder.add_from_file('test1.glade')
window1 = builder.get_object('window1')
treeview1 = builder.get_object('treeview1')
class Signals:
def on_window1_destroy(self, widget):
Gtk.main_quit()
file_data = [[True, "a", 1],
[True, "b - select this", 2],
[True, "c", 3],
[True, "d", 4]]
treestore1 = Gtk.TreeStore(bool, str, int)
iter1 = treestore1.append(None, file_data[0])
iter2 = treestore1.append(None, file_data[1])
iter3 = treestore1.append(None, file_data[2])
iter4 = treestore1.append(None, file_data[3])
#treeview1.set_model(treestore1)
treemodelfilter1 = treestore1.filter_new()
treemodelfilter1.set_visible_column(0)
treemodelsort1 = Gtk.TreeModelSort.new_with_model(treemodelfilter1)
treeview1.set_model(treemodelsort1)
for i, column_title in enumerate(["Column1", "Column2"]):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(column_title, renderer, text=i+1)
column.set_sort_column_id(i+1)
treeview1.append_column(column)
treeview1.get_column(1).clicked()
treeview1.get_column(1).clicked()
#treeview1.get_selection().select_iter(iter2)
path = treestore1.get_path(iter2)
treeview1.get_selection().select_path(path)
builder.connect_signals(Signals())
window1.show_all()
Gtk.main()
以下是Glade designer GUI文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="default_width">300</property>
<property name="default_height">300</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkTreeView" id="treeview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
</child>
</object>
</interface>
假的
300
300
真的
真的
我已使用以下代码修复了该问题:
treeview1.get_column(1).clicked() # Existing code in the question
treemodelsort1.set_sort_column_id(1, Gtk.SortType.ASCENDING) # Solution
path = treestore1.get_path(iter2) # Existing code in the question
必须首先对树存储进行排序,然后才能正确获取路径
编辑:此代码有效,但根据@theGtknerd的回答,它不是问题的精确解决方案。目前,我对@theGtknerd答案的确切解决方案和细节一无所知。对于其他来到这里的人来说,实际问题是,在同一树视图的不同模型之间混合
iters
或路径
,结果并不理想。如果你得到一个过滤存储的路径,不要将它应用到排序存储,等等。有很多方法可以解决这个问题,但是它们非常复杂。他们需要一整篇文章来解释这些细微差别。实际上,如果您需要在商店的路径上操作,请从同一家商店获取您的信息