【问题标题】:GTK - Python Treeview Selecting A Row ProgrammaticallyGTK - Python Treeview 以编程方式选择一行
【发布时间】:2021-06-03 06:15:27
【问题描述】:

我有一个 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>

【问题讨论】:

    标签: python python-3.x treeview gtk gtk3


    【解决方案1】:

    对于其他来到这里的人来说,实际的问题是在同一 Treeview 的不同模型之间混合 iterspaths 效果不佳。如果您获得过滤存储的路径,请不要将其应用于排序存储等。有一些方法可以解决这个问题,但它们非常复杂。他们值得一整篇文章来解释细微差别。在实践中,如果您需要在商店的路径上进行操作,请从同一家商店获取您的信息。

    【讨论】:

      【解决方案2】:

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

      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 的答案的确切解决方案和细节。

      【讨论】:

        【解决方案3】:

        由于您使用 treemodelfilter1 对树视图进行排序。要在选择后获得选择的确切树路径,可以使用 treemodelfilter1 而不是 treestore1。这应该可以。

        
            path = treemodelfilter1.get_path(iter2)
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多