Datensatzwidget - mit TreeView und ListStore

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
sedi
User
Beiträge: 101
Registriert: Sonntag 9. Dezember 2007, 19:22

Freitag 24. Juni 2016, 18:24

Hallo zusammen,

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:
Bild

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()
Zuletzt geändert von Anonymous am Freitag 24. Juni 2016, 20:26, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
CU sedi
----------------------------------------------------------
Python 3.4
openSUSE 13.2
Antworten