首页 > 解决方案 > GTK - Python Treeview 以编程方式选择一行

问题描述

我有一个 GTK3 GUI(使用 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 设计器 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>

标签: pythonpython-3.xtreeviewgtkgtk3

解决方案


我已经使用以下代码解决了这个问题:

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

必须首先对 Treestore 进行排序,然后才能正确获取该路径。

编辑:此代码有效,但根据@theGtknerd 的回答,它不是问题的确切解决方案。目前我不知道@theGtknerd 答案的确切解决方案和细节。


推荐阅读