ich scheitere kläglich dabei mit einem Treeview umzugehen. . .
Es gelingt mir mit Glade ein Treeview mit verbundenem Liststore zu erstellen und die Signale im Python Code zu verwerten.
Aber das Konzept im Hintergrund ist mir unbegreiflich - ich habe einiges im Web dazu gelesen, aber entweder es ist zu schlecht erklärt, oder ich bin zu doof.
Was mir vermutlich weiterhilft, wäre eine Antwort auf folgende Fragen:
- Wie greife ich auf die im Treeview angezeigten Daten des Liststores zu? (Lesen und ändern)
- Wieso kann ich mit "li.append([1, 2, 3])" [zeile 21 in meinem Code] nicht eine "Zeile" anhängen?
Erst mit den folgenden Zeilen im Code [23 etc. ] werden von mir eigentlich unerwünschte Spalten hinzugefügt und dann erst erscheinen die Daten - natürlich an völlig falscher Stelle. . .
- Welche Einstellung in Glade brauche ich damit ich als Datentyp für die Spalten einen String bekomme?
Mir fehlt offensichtlich ein sehr grundlegendes Stück Verständnis, aber trotz langer Suche, finde ich keine mir verständliche Erklärung.
Vielleicht könnt Ihr mir etwas weiterhelfen?
Jeder Hinweis willkommen. . .
HG,
Der Python Code:
Code: Alles auswählen
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class handler: # Signalverarbeitung für die Glade Signale
def on_TVFenster_destroy(self, *args):
Gtk.main_quit()
def on_spalte1_clicked(self, ObjektSpalte):
print("Spalte1 angeklickt")
print(ObjektSpalte.get_title())
tv.set_cursor(0) # path=0 ist die erste Zeile, 1 die zweite usw.
tree_iter = li.get_iter(0)
value = li.get_value(tree_iter, 0)
print(value)
def on_Treeview_cursor_changed(self, selection):
print("TVListe Cursor changed")
class Start():
def __init__(self):
li.append([1, 2, 3])
li.append([4, 5, 6])
columns = ["Noch ńe Spalte", "5.", "6."]
for i, column in enumerate(columns): # for each column
cell = Gtk.CellRendererText() # cellrenderer to render the text
col = Gtk.TreeViewColumn(column, cell, text=i) # the column is created
tv.append_column(col) # and it is appended to the treeview
if __name__ == '__main__':
builder = Gtk.Builder()
builder.add_from_file("MiniTreeView.glade")
builder.connect_signals(handler())
window = builder.get_object("TVFenster")
window.show_all()
li = builder.get_object("Liststore")
tv = builder.get_object("Treeview")
Start()
Gtk.main()
Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkListStore" id="Liststore">
<columns>
<!-- column-name spalte1 -->
<column type="gchar"/>
<!-- column-name spalte2 -->
<column type="gchar"/>
<!-- column-name spalte3 -->
<column type="gchar"/>
</columns>
<data>
<row>
<col id="0">0</col>
<col id="1"/>
<col id="2"/>
</row>
</data>
</object>
<object class="GtkWindow" id="TVFenster">
<property name="can_focus">False</property>
<signal name="destroy" handler="on_TVFenster_destroy" swapped="no"/>
<child>
<placeholder/>
</child>
<child>
<object class="GtkTreeView" id="Treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">Liststore</property>
<signal name="cursor-changed" handler="on_Treeview_cursor_changed" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn" id="spalte1">
<property name="title" translatable="yes">column</property>
<property name="clickable">True</property>
<signal name="clicked" handler="on_spalte1_clicked" swapped="no"/>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="spalte2">
<property name="title" translatable="yes">Titel b</property>
<property name="clickable">True</property>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="spalte3">
<property name="title" translatable="yes">column</property>
<property name="clickable">True</property>
</object>
</child>
</object>
</child>
</object>
</interface>