Как назначить «скрытые данные» строке Gtk.TreeView, чтобы перехватить их с помощью Gtk.TreeView.connect («строка активирована»)? - PullRequest
0 голосов
/ 17 апреля 2020

В Python у меня есть класс person, который содержит firstName и lastName, а также country атрибуты (на самом деле это гораздо больше других данных, но я упрощаю это для примера).

Итак, я создаю таблицу, в которой должны отображаться только firstName и lastName (пользователь не должен видеть страну). Но когда пользователь щелкает указанную строку c, я хочу получить полный person объект.

Это мой код:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# MWE for hidden data in Gtk.TreeView

import sys
import os
import gi

gi.require_version('Gtk', '3.0')

from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import Gio
from gi.repository import Pango


class person():
    def __init__(self, firstName, lastName, country):
        self.firstName=firstName
        self.lastName=lastName
        self.country=country

personsList=[
    person("Ada",   "Lovelace", "UK"),
    person("Alan",  "Turing",   "UK"),
    person("Denis", "Richie",   "USA")
]

def onRowChange(widget, row, col):
    # This function is executed when a user click on a row
    print(widget)
    print(row)
    print(col)
    pass


class GridWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="TreeView MWE")
        self.connect("destroy", Gtk.main_quit)

        # Setting up the self.grid in which the elements are to be positionned
        self.grid = Gtk.Grid()
        self.grid.set_column_homogeneous(True)
        self.grid.set_row_homogeneous(True)
        self.add(self.grid)

        # Preparing the list store
        listStore=Gtk.ListStore(str, str)
        for aPerson in personsList:
            listStore.append([aPerson.firstName, aPerson.lastName])

        # Seting up the TreeView and given the ListStore to the Treeview
        treeView=Gtk.TreeView(model=listStore)
        renderer_text = Gtk.CellRendererText()

        # Preparing the headers
        column_text = Gtk.TreeViewColumn("First Name", renderer_text, text=0)
        treeView.append_column(column_text)
        column_text = Gtk.TreeViewColumn("Last Name", renderer_text, text=1)
        treeView.append_column(column_text)

        # Setting the event connection
        treeView.connect("row-activated", onRowChange)


        # Attaching the treeView to the Gride
        self.grid.add(treeView)




screen = Gdk.Screen.get_default()
styleContext = Gtk.StyleContext()


win = GridWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

А вот рендеринг :

enter image description here

Как видите, функция onRowChange() может получать объекты TreeView и TreeViewColumn только тогда, когда пользователь нажимает на это, в соответствии с документацией сигнала row_activated.

Я знаю, что могу получить номер строки и искать в списке, ведь у объекта есть номер строки, но он слишком опасен и немного bit hacky .

Так есть ли способ включить в Gtk.ListStore скрытые данные пользователя и вернуть эти данные с помощью сигнала row-activated?

1 Ответ

0 голосов
/ 17 апреля 2020

Вы можете просто добавить данные в хранилище списков, не отображая их в виде дерева. Следующий фрагмент кода показывает необходимые изменения:

...
def onRowChange(widget, row, col):
    # This function is executed when a user click on a row
    model = widget.get_model()
    iter_ = model.get_iter(row)
    person = model.get_value(iter_, 2)
    print(person.country)


class GridWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="TreeView MWE")
        self.connect("destroy", Gtk.main_quit)

        # Setting up the self.grid in which the elements are to be positionned
        self.grid = Gtk.Grid()
        self.grid.set_column_homogeneous(True)
        self.grid.set_row_homogeneous(True)
        self.add(self.grid)

        # Preparing the list store
        listStore=Gtk.ListStore(str, str, object)
        for aPerson in personsList:
            listStore.append([aPerson.firstName, aPerson.lastName, aPerson])
...
...