Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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
GTK-Python树视图以编程方式选择行_Python_Python 3.x_Treeview_Gtk_Gtk3 - Fatal编程技术网

GTK-Python树视图以编程方式选择行

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

我有一个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')
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
路径
,结果并不理想。如果你得到一个过滤存储的路径,不要将它应用到排序存储,等等。有很多方法可以解决这个问题,但是它们非常复杂。他们需要一整篇文章来解释这些细微差别。实际上,如果您需要在商店的路径上操作,请从同一家商店获取您的信息