В 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()
А вот рендеринг :
Как видите, функция onRowChange()
может получать объекты TreeView
и TreeViewColumn
только тогда, когда пользователь нажимает на это, в соответствии с документацией сигнала row_activated
.
Я знаю, что могу получить номер строки и искать в списке, ведь у объекта есть номер строки, но он слишком опасен и немного bit hacky .
Так есть ли способ включить в Gtk.ListStore
скрытые данные пользователя и вернуть эти данные с помощью сигнала row-activated
?