Zugriff auf ‚Spalten‘ in GtkTreeView ist ein wenig komplizierter, als auf dem ersten Blick vermutet. Einer der Gründe ist, dass Spalten tatsächlich mehrere Elemente enthalten können, die dann als neue Spalte angezeigt werden, obwohl sie "gepackt" sind.
Eine Möglichkeit, Spalten zu identifizieren, besteht darin, jedem eine sort_id zuzuweisen, aber das würde die Header anklickbar machen, was unnatürlich ist, wenn die Sortierung nicht funktioniert.
ich erdacht diese (etwas abwegig) Methode:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# test_coord.py
#
# Copyright 2016 John Coppens <[email protected]>
#
# This program is free software```; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
#
from gi.repository import Gtk
class MainWindow(Gtk.Window):
def __init__(self):
super(MainWindow, self).__init__()
self.connect("destroy", lambda x: Gtk.main_quit())
trview = Gtk.TreeView()
tstore = Gtk.ListStore(str, str, str)
renderer = Gtk.CellRendererText()
for i in range(3):
col = Gtk.TreeViewColumn("Col %d" % i, renderer, text = i)
col.colnr = i
trview.append_column(col)
trview.set_model(tstore)
trview.connect("button-press-event", self.on_pressed)
for i in range(0, 15, 3):
tstore.append((str(i), str(i+1), str(i+2)))
self.add(trview)
self.show_all()
def on_pressed(self, trview, event):
path, col, x, y = trview.get_path_at_pos(event.x, event.y)
print("Column = %d, Row = %s" % (col.colnr, path.to_string()))
def run(self):
Gtk.main()
def main(args):
mainwdw = MainWindow()
mainwdw.run()
return 0
if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))
Der Trick hier ist die Möglichkeit Python
Angebote zu verwenden, um Attribute zu vorhandenen Klassen hinzuzufügen. Also fügte ich zu jeder Spalte eine colnr
hinzu und verwendete diese, um die angeklickte Zelle zu identifizieren. In C++ wäre es notwendig, die Methoden set_data
und get_data
zu verwenden, um dasselbe zu tun (die nicht in Python
verfügbar sind).
Das war eigentlich die zweite Sache, die mir in den Sinn kam, und das habe ich schon gemacht, als ich versuchte, meinen ersten Ansatz zu implementieren :) Danke für Ihre Hilfe! – tim