2016-06-27 20 views
1

Gibt es einen effizienten Weg, die Spalte der ausgewählten Zelle in einem ListModel abzurufen, wenn ein Benutzer auf eine Zelle in einem TreeView klickt? Oder gibt es keine Dinge wie Zellen und nur Zeilen können ausgewählt werden und geben ihre Struktur/Modell zurück, wenn ich die Methode get_selected() aufrufen?Gtk3 + Pygobject Auswahl von Spalten in einem TreeView

Ich möchte dem Benutzer eine Matrix von numerischen Werten präsentieren und ihm erlauben, eine Spalte auszuwählen, welche Werte dann geplottet werden.

Wenn Sie Dokumentation/Beispiele zur Hand haben, zögern Sie bitte nicht :)

EDIT zu teilen: Was ich versucht, das angeklickt Ereignis zu tun, um eine Funktion auf die Spaltenüberschriften wurde verbindet, die mir gibt den Spaltennummer, die ich während der Erstellung im Spaltentext codiert habe. Aber das scheint nicht ganz richtig ..

ich ein minimales Arbeitsbeispiel schaffen kann, wenn das helfen würde ..

Antwort

2

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).

+0

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