ich will für die Eingabe in eine Datenbanktabelle das TreeView nutzen - leider bin ich meilenweit davon entfernt ein "Datensatzwidget" zu erstellen. Im Netz habe ich bisher wenig dazu gefunden.
Folgendes Bild sollte das Vorhaben am besten verdeutlichen:
1) Zum ersten bin ich bereits daran gescheitert, die Zeilen unterschiedlich farbig zu hinterlegen. Ich habe in der Doku zwar gefunden, dass es eine StyleProperty ist, aber keinen (für mich nachvollziehbaren) Hinweis gefunden, wie man den zu erstellenden StyleContext dann mit dem Widget verbindet.
2) Kann man in einem TreeView mit ListStore überhaupt solche Buttons zur Datenmanipulation am Ende einbinden?
Folgenden Code habe ich bisher erstellt:
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
import logging
spalten = [
("Nachname", str),
("Vorname", str),
("Antrag", str),
("Geschlecht", str),
("Email", str),
]
datensaetze = [
["Arnold", "Alfred", "2016-03-08", "m", "arnoldalfred@mail.com"],
["Brunner", "Britta", "", "w", "brunnerbritta@mailing.net"],
["Coelho", "Carsten", "2014-11-21", "m", "ccoelho@emailer.com"],
["Dahnke", "Dorothea", "", "w", "ddoro@emailer.com"],
["Ehrmann", "Eduard", "2001-04-30", "m", "ehmannede@mail.com"],
]
class MyTreeView(Gtk.Window):
def __init__(self, title, **kwargs):
Gtk.Window.__init__(self, **kwargs)
self.title = title
self.store = Gtk.ListStore(*[h[1] for h in spalten])
self.set_title(title)
self.set_size_request(-1, -1)
self.connect("destroy", Gtk.main_quit)
self.setup_view()
self.load_data()
self.show_all()
def setup_view(self):
self.treeview = Gtk.TreeView(model=self.store)
self.add(self.treeview)
# FIXME: Styling der Zeilen, insbesondere der ersten Zeile fehlt
style = self.treeview.get_style_context()
# Fuer jede Spalte muss ein TreeViewColumn-Objekt
# bereitgestellt werden, dass als zweites Argument
# ein Renderer-Objekt erwartet.
# FIXME: Wie bekomme ich die Aktionsbuttons ins TreeView?
for i, colname in enumerate([h[0] for h in spalten]):
renderer = Gtk.CellRendererText(
editable=True)
col = Gtk.TreeViewColumn(
colname, renderer, text=i)
col.props.resizable = True
self.treeview.append_column(col)
select = self.treeview.get_selection()
select.connect("changed", self.on_tree_selection_changed)
self.treeview.set_size_request(460, 400)
def load_data(self):
logging.debug("%s Zeilen", len(datensaetze))
for dataset in datensaetze:
self.store.append(dataset)
# events
def on_tree_selection_changed(self, selection, *args):
model, treeiter = selection.get_selected()
if treeiter != None:
info = "Ausgewählt wurde {}".format(
str([str(x) for x in model[treeiter]])
)
print(info)
d = Gtk.MessageDialog(
parent=self,
type=Gtk.MessageType.INFO,
flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
buttons=Gtk.ButtonsType.CLOSE,
message_format=info)
d.run()
d.destroy()
if __name__ == "__main__":
m = MyTreeView("TreeView example")
Gtk.main()