python - 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>
解决方案
我已经使用以下代码解决了这个问题:
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 答案的确切解决方案和细节。
推荐阅读
- c# - 基于C#中List中泛型ID的标记总和
- node.js - 重写规则,使具有绝对路径的css和js文件正确加载
- android - 我的移动应用程序 SaaS 单点登录流程是否正确?
- excel - Excel/Google 表格的 IF 声明
- c# - unity c# 马里奥游戏
- python - 绘图上的双标记 Matlotlib
- javascript - 使用 html 按钮而不是使用 Mapbox GL JS 的链接来切换 GeoJSON 图层
- c++ - `shared_ptr`s 如何实现协方差?
- elixir - elixir - Ecto 变更集成功和失败代码不再运行
- python - 如何在 URL 中使用页码抓取多个页面