#1  
Alt 11.10.2020, 22:49
Oberschwabe Oberschwabe ist offline männlich
Benutzer
 
Registriert seit: 23.07.2016
Beiträge: 36
Frage Makros für Gramps?

Hallo zusammen,

ich nutze Gramps zur Erfassung meiner Ahnen und bin generell sehr zufrieden damit. Lediglich die Dateneingabe finde ich etwas umständlich.

Besonders wenn man z.B. viele Personen oder Quellen auf einmal anlegen will, muss man sehr viel stupides Klicken in Kauf nehmen.

In Excel schreibe ich mir in so einem Fall ein Makro, d.h. ich muss den "Klickablauf" nur einmal als Programmcode erstellen und kann diesen dann so oft ich möchte durchlaufen lassen.

Auch von anderen Computerprogrammen (keine Genealogieprogramme) kenne ich die Möglichkeit ein Python-Skript zu laden anstatt sich manuell durch die Benutzeroberfläche zu klicken. So kann beispielsweise ein bestimmter Schritt ganz einfach mit 100 verschiedenen Parametern wiederholt werden, indem der entsprechende Befehl im Python-Skript in eine Schleife gepackt wird.

Da Gramps in Python programmiert ist, habe ich mir erhofft, dass so etwas in der Art möglich ist. Es würde sehr vieles erleichtern. Z.B. könnte man zu einer ganzen Liste von Kirchenbüchern automatisiert Quellen anlegen, die jeweils den Titel des Kirchenbuchs tragen ohne sich für jede einzelne Quelle durch den Dialog klicken zu müssen. Auch Änderungen wären viel einfacher durchzuführen. Um zum Beispiel alle Familiennamen auf Großschreibung zu ändern müsste das Skript nur jede einzelne Person bearbeiten und den Namen durch die großgeschriebene Variante ersetzen.

Leider habe ich dazu absolut nichts gefunden. Vielleicht könnt ihr mir weiterhelfen oder habt andere Tricks um effektiver mit Gramps zu arbeiten.

Grüße

Oberschwabe

PS: Ich bin kein großer Computer-Experte. Ich kann zwar Python programmieren, habe dies bisher aber nur unabhängig von anderen Programmen gemacht. D.h. eigene Gramplets zu erstellen oder ähnliches schaffe ich nicht ohne weiteres.
Mit Zitat antworten
  #2  
Alt 12.10.2020, 10:41
1975reinhard 1975reinhard ist offline männlich
Erfahrener Benutzer
 
Registriert seit: 30.10.2008
Beiträge: 265
Standard

Hallo Oberschwabe,

es gibt einen csv-Import für Personen und Orte.
Vielleicht könnte man das als Basis für einen Import von Quellen verwenden.

Viele Grüße
Reinhard
__________________
Forschungsgebiete:

waldviertel-genealogie.jimdo.com/
  • NÖ (Waldviertel): Region Gmünd, Weitra, Schrems, Döllersheim
suedmaehren-genealogie.jimdo.com/
  • Südmähren: Gebiet um Joslowitz
traunviertel-genealogie.jimdo.com/
  • OÖ: Traunseeregion, Ampflwang, Ottnang,...
http://sudeten-genealogie.jimdo.com/
  • Böhmen: Beneschau (bei Prag), Königgrätz, Nechanitz, Winterberg/Prachatitz
  • Schlesien: Gebiet um Wigstadtl
  • (Süd-)Mähren: Lispitz
Mit Zitat antworten
  #3  
Alt 12.10.2020, 11:48
Basil Basil ist offline männlich
Erfahrener Benutzer
 
Registriert seit: 16.06.2015
Ort: Hamburg
Beiträge: 1.290
Standard Python

Moin Oberschwabe!

1.) Es gibt ein Python Shell Gramplet, wodurch man eine Python Shell in Gramps hat.

2.) Es gibt eine Gramps Database API, mit der sich Gramps als Library in Python einbinden lässt. (Keine Ahnung, ob das IT-mäßig richtig formuliert war.)
Jedenfalls gibt es u.a. dieses kleine Youtube-Video, zur Anregung.

Meine Python-Erfahrung beschränkt sich bisher auf die Ansteuerung von GPIOs bei kleinen, fruchtigen Einplatinenrechnern. Und mit SQL hatte ich vor Jahren mal in einem VBA-Makro in Access zu tun. Darum habe ich mich bisher noch nicht an Gramps UND Python ran gewagt.

Vielleicht ist das ein Ansatz für dich. Kannst ja dann gerne berichten.

Viele Grüße
Basil
__________________
Zimmer: Oberlausitz und Dresden; Stephanus: Zittau, Altenburg und Ronneburg
Raum Zittau: Heidrich, Rudolph
Erzgebirge: Uhlmann, Lieberwirth, Gläser, Herrmann
Burgenlandkreis: Wachtler, Landmann, Schrön


Mit Zitat antworten
  #4  
Alt 12.10.2020, 12:07
Benutzerbild von OlliL
OlliL OlliL ist offline männlich
Erfahrener Benutzer
 
Registriert seit: 11.02.2017
Ort: NRW
Beiträge: 3.621
Standard

Moin,

es gibt einige Shortcuts in Gramps - aber leider nicht ausreichend viele.
Ich habe mir für die Erfassung meines OFB die Programmierfähigkeit der 3x18 Sondertasten meiner Tastatur zunütze gemacht. Somit habe ich z.B. auf eine Taste gelegt:
- Spring vom Feld Vorname in den Bereich "Ereignisse"
- Lege ein neues Ereignis vom Typ Beruf an
- gebe im Kommentar "Arbeiter" ein

oder

- Spring vom Feld Familienname in den Bereich Ereignisse
- Lege ein neues Ereignis des nächsten folgenden Typs an
- Wähle als Ereignisort "Güstow" aus
- Kopiere den Inhalt der Zwischenablage in das Feld "Datum" (da steht dann meist das aktuelle Jahr drin deren Geburten ich gerade erfasse).

Die Reihenfolge der Ereignisse habe ich im Gramps Quellcode für mich angepasst auf
- Religion
- Geburt
- Taufe
- Tod
- Beerdigung

Ich habe dann noch einige Shortcuts um in Gramps in die einzelnen Sichten zu springen usw.....

Viele Grüße,
OlliL

Geändert von OlliL (12.10.2020 um 12:08 Uhr)
Mit Zitat antworten
  #5  
Alt 12.10.2020, 14:06
HKD HKD ist offline
Benutzer
 
Registriert seit: 20.06.2010
Beiträge: 49
Standard

Hej Oberschwabe,

zu den bisherigen Tipps lässt sich noch anderes Anführen. Z. B. die Zwischenablage oder das Formulargramplet.

Zu guter Letzt kannst Du Deinen bestehenden Stammbaum als XML-Datei exportieren, mit einem Texteditor oder z. B. mit einem Basic-Makro (wie in Excel) manipulieren, und als neuen Stammbaum wieder importieren.

"So kann beispielsweise ein bestimmter Schritt ganz einfach mit 100 verschiedenen Parametern wiederholt werden, indem der entsprechende Befehl - WIE - im Python-Skript in eine Schleife gepackt wird."

Beste Grüße
HKD
Mit Zitat antworten
  #6  
Alt 12.10.2020, 17:13
sonki sonki ist offline
Erfahrener Benutzer
 
Registriert seit: 10.05.2018
Beiträge: 2.554
Standard

Hallo,

prinzipiell kann man per Python sowas machen. Hier mal als grobe Anregung ein Beispiel wie man z.b. Repositories und Quellen in die Datenbank hinzufügen kann:

Im Beispiel füge ich ein Repository mit dem Namen "Archiv ABC" sowie eine Quelle mit Namen "Kirchenbuch XYZ" hinzu. In der Praxis könnte man hier noch den Typ einstellen und alle anderen Parameter die es so gibt. Auch Verknüpfungen untereinander sind so möglich.

Werte in <VARIABLE> müssen jeweils angepasst werden. Die Pfade müssten logischerweise auch angepasst werden - mein System ist aktuell Win64 mit Gramps 5.1.3.

Disclaimer: Ist hier ein schnell zusammengeschusterter Code. Ein Test hat zwar gezeigt das es funktioniert, aber ich habe keine Ahnung ob man das so wie im unten angefügten Code macht. Auch sind absolut keine Checks eingebaut, halt einfach nur ein proof-of-concept.

Code:
import sys
import os
import sqlite3

os.environ['GRAMPS_RESOURCES'] = 'C:/Users/<USERNAME>/AppData/Local/GrampsAIO64-5.1.3/share'
sys.path.append(r'C:\Users\<USERNAME>\AppData\Local\GrampsAIO64-5.1.3')

from gramps.gen.dbstate import DbState
from gramps.plugins.db.dbapi import sqlite
from gramps.gen.lib import Repository, Source
from gramps.gen.db.txn import DbTxn

db = sqlite.SQLite('C:/Users/<USERNAME>/AppData/Roaming/gramps/grampsdb/<DB_ID>')

####################################
source = Source()
source.set_title('Kirchenbuch XYZ')
transaction = DbTxn('msg', db)
db.add_source(source, transaction)
db.transaction_commit(transaction)
####################################
repo = Repository()
repo.set_name('Archiv ABC')
transaction = DbTxn('msg', db)
db.add_repository(repo, transaction)
db.transaction_commit(transaction)
####################################
db.close()
D.h. theoretisch könnte man das so aufbohren, das ein csv eingelesen wird und daraus in einer Schleife obiger Code (die Teile in den ######) durchlaufen wird.
__________________
Private Nachrichten möglichst vermeiden!

Geändert von sonki (12.10.2020 um 17:17 Uhr)
Mit Zitat antworten
  #7  
Alt 12.10.2020, 17:50
Benutzerbild von Andre_J
Andre_J Andre_J ist offline
Erfahrener Benutzer
 
Registriert seit: 20.06.2019
Beiträge: 277
Standard

Das Formulare Gramplet wäre eigentlich schon sehr sinnvoll. Leider sind die Beschreibung im gramplet-wiki und die verfügbaren Youtube-Videos nur begrenzt hilfreich, wenn man was eigenes bauen will.

So muß die Definitionsdatei bei Gramps 5.1 unter Windows im Ordner
C:\Users\(username)\AppData\Roaming\gramps\gramps5 1\plugins\Form
stehen, und der Eigenbau muß test.xml oder custom.xml heißen.

Viel weiter bin ich noch nicht gekommen. Die anderen Beispiele im Verzeichnis können als Vorlage dienen, wobei man sich noch mit der Übersetzung der Schlüsselworte ins Englische rumplagen muß.

UPDATE:
Inzwischen bin ich schon etwas schlauer:
Man kann mit einem Formular genau einen Ereignistyp bearbeiten, also z.B. Geburt, Hochzeit oder Volkszählung.
Dabei können mehrere Personen aus der Datenbank ausgewählt oder angelegt werden, die dann mit einer entsprechenden Rolle dieses Ereignis verpasst bekommen.
Was aber nicht klappt: Zum eingegebenen Brautvater automatisch die Familie ihrer Eltern anlegen. Stattdessen bekommt der Mensch die Heirat seiner Tochter mit der Rolle "Brautvater". Diese Angaben werden aber in den "normalen" Eingabeformularen nicht angezeigt. In Berichten tauchen sie immerhin als Auflistung auf. Im Gedcom-Export werden sie wohl unter den Tisch fallen.
Bei der Volkszählung kann alles Mögliche erfasst werden (Alter, Beruf, Anzahl Kinder), aber auch das wird nicht weiter ausgewertet.

Gruß,
Andre_J

Geändert von Andre_J (13.10.2020 um 12:50 Uhr)
Mit Zitat antworten
  #8  
Alt 13.10.2020, 23:16
Oberschwabe Oberschwabe ist offline männlich
Benutzer
Themenstarter
 
Registriert seit: 23.07.2016
Beiträge: 36
Standard

Vielen Dank für eure Beiträge!

Der csv-Import gefällt mir sehr gut und ist in Kombination mit dem Import-Gramplet auch sehr einfach zu handhaben. Ich kann mir gut vorstellen in Zukunft bei Familien mit vielen Kindern zunächst das Elternpaar anzulegen, dann die Kinder bequem in Excel zu erfassen und als csv zu importieren.

Tastaturkürzel sind natürlich auch sehr praktisch. Danke für den Tipp!

Den Code von sonki werde ich sobald wie möglich ausprobieren. Das klingt schon sehr nachdem was ich suche Wenn ich das richtig verstehe, greifen die Befehle am Anfang (from gramps.gen.dbstate import DbState, ...) auf die von Basil erwähnte API Schnittstelle zu? Und mit dem Python Shell Gramplet könnte ich das direkt in Gramps ausführen, d.h. ich habe sozusagen einen Python-Editor in Gramps eingebaut und brauche keinen Editor extra öffnen?

Das Formular-Gramplet habe ich mir vor kurzem auch mal angeschaut und dann wieder aufgegeben. Aber wenn ich Andre_J richtig verstehe, könnte man damit z.B. auch alle Kinder eines Ehepaars auf einmal anlegen, indem man ein Formular zum Ereignis Geburt nutzt, womit zu jeder Geburt das entsprechende Kind erstellt wird. Wobei in diesem Fall der csv-Import wohl einfacher wäre.

Die Datenbank als XML zu exportieren, zu bearbeiten und wieder zu importieren klingt auch vielversprechend. Zuerst muss ich mich aber ein wenig über XML schlau machen.

Ich hoffe, dass ich am Wochende Zeit finde, eure Vorschläge auszuprobieren. Ich werde auf jeden Fall berichten, wenn etwas dabei rauskommt.

Grüße
Oberschwabe

Geändert von Oberschwabe (13.10.2020 um 23:17 Uhr)
Mit Zitat antworten
  #9  
Alt 14.10.2020, 00:36
sonki sonki ist offline
Erfahrener Benutzer
 
Registriert seit: 10.05.2018
Beiträge: 2.554
Standard

Zitat:
Zitat von Oberschwabe Beitrag anzeigen
Den Code von sonki werde ich sobald wie möglich ausprobieren. Das klingt schon sehr nachdem was ich suche Wenn ich das richtig verstehe, greifen die Befehle am Anfang (from gramps.gen.dbstate import DbState, ...) auf die von Basil erwähnte API Schnittstelle zu? Und mit dem Python Shell Gramplet könnte ich das direkt in Gramps ausführen, d.h. ich habe sozusagen einen Python-Editor in Gramps eingebaut und brauche keinen Editor extra öffnen?
Ja, die from gramps.gen.dbstate import DbState usw. Importe nutzen _eine_ Möglichkeit um auf die Gramps DB API zuzugreifen.
&
Jain, der Codeschnipsel war eigentlich als komplett eigenständiges Script gedacht, aber unter Umständen könnte es leicht angepasst auch im Python Shell Gramplet laufen, wobei man da doch einige Anpassungen vornehmen müsste - die Importe wären leicht anders, os.environ und sys.path.append dürften dann vermutlich auch wegfallen. Ich werde vielleicht mal die Tage aus Spaß versuchen eine komplette Familie aus einem CSV in die Datenbank zu laden, wobei ich mir da erstmal ein Tabellenstruktur für das .csv aus den Finger saugen müsste. Weil die CSV Struktur und das Einlesen und sinnvolle Verarbeiten der Daten den Großteil der Logik im Script ausmachen würde. Das eigentliche Schreiben in die DB ist der leichteste Teil.

P.S. Eine Änderung der Nachnamen zu Uppercase wäre glaube ich extrem einfach mit obigen Script. Also sqlite Datenbank einladen, dann gibt es afaik ein Befehl mit dem man alle Handles von allen Personen bekommt, die man dann nur noch durchiterieren und den Namen einfach in uppercase ändern müsste.

P.S. proof-of-concept für eine einfache Namensänderung aller Nachnamen:
Standalone-Script um die Nachnamen in Uppercase umzuwandeln - gut möglich das es viel einfacher geht, aber ein Test bei mir mit einer Test-Datenbank hat funktioniert. Aber wie gesagt, ich habe mich zum ersten Mal mit der gramps API befasst und vieles ist mir noch überhaupt nicht klar - halt trial-and-error:

Kurzbeschreibung:

+ Ich iteriere durch alle Personen Objekte aus get_person_handles()
+ in jedem Durchlauf (pro Person) wird aus dem Personenobjekt für den Hauptnamen (primary_name) die Nachnamenliste (es kann ja mehrere pro Person geben) extrahiert
+ Jeder Nachname aus der Liste wird in uppercase() umgewandelt. Am Ende der inneren Schleife wird die neue Nachnamenliste in das Hauptnamen-Objekt geschrieben.
+ das Personenobjekt bekommt nun das aktualisierte Hauptnamenobjekt
+ das Personenobjekt wird in die DB geschrieben - da es bereits intern eine gramps ID hat, wird die DB aktualisiert und die Personen nicht neu hinzugefügt.

Code:
import sys
import os
import sqlite3

os.environ['GRAMPS_RESOURCES'] = 'C:/Users/<USERNAME>/AppData/Local/GrampsAIO64-5.1.3/share'
sys.path.append(r'C:\Users\<USERNAME>\AppData\Local\GrampsAIO64-5.1.3')

from gramps.plugins.db.dbapi import sqlite
from gramps.gen.db.txn import DbTxn

db = sqlite.SQLite('C:/Users/<USERNAME>/AppData/Roaming/gramps/grampsdb/<DB_ID>')

for person_handle in db.get_person_handles():
    person = db.get_person_from_handle(person_handle)
    name = person.get_primary_name()
    surname_list = []
    for surname in name.get_surname_list():
        orig_surname = surname.get_surname()
        surname.set_surname(orig_surname.upper())
        surname_list.append(surname)
    name.set_surname_list(surname_list)
    person.set_primary_name(name)
    transaction = DbTxn('msg', db)
    db.add_person(person, transaction)
    db.transaction_commit(transaction)
Die interne Datenstruktur bei Gramps ist schon nicht ohne und nicht vergleichbar mit einer normalen gedcom Text-Datei.
__________________
Private Nachrichten möglichst vermeiden!

Geändert von sonki (14.10.2020 um 19:07 Uhr)
Mit Zitat antworten
  #10  
Alt 14.10.2020, 14:24
HKD HKD ist offline
Benutzer
 
Registriert seit: 20.06.2010
Beiträge: 49
Standard

Hej Oberschwabe,

Zitat: "Ich kann mir gut vorstellen in Zukunft bei Familien mit vielen Kindern zunächst das Elternpaar anzulegen, dann die Kinder bequem in Excel zu erfassen und als csv zu importieren".

OK, kann man so machen. Man kann aber auch von Köln über Berlin nach München fahren.

Bitte entschuldige diesen harten Vergleich, aber was ist einfacher als die Kinder direkt in Gramps einzugeben?
Du hast eine Quelle/Fundstelle, die Du einmalig über die Quellenverwaltung anlegst und dann in die Zwischenablage schiebst.
Du hast einen Ort, den Du - wenn er nicht schon vorhanden ist - über die Orteverwaltung anlegst und von dort in die Zwischenablage schiebst .
Du hast evtl. Medien, die Du einmalig über die Medienverwaltung anlegst und dann in die Zwischenablage schiebst.

Im Familieneditor klickst Du auf 'Kind hinzufügen', gibst den Vornamen ein, der Nachname wird Dir (vom Vater abgeleitet) bereits vorgeschlagen.

Im Ereigniseditor muss nur noch das Datum eingetragen werden. Die Ereignisart 'Geburt' ist bereits vorbelegt, den Ort ziehst Du mit der Maus aus der Zwischenablage ins Ortefeld. Und aus der Zwischenablage ziehst Du auch Quelle/Fundstelle und ggf. Medium auf die entsprechenden Reiter im Personeneditor.

Die in der Zwischenablage abgelegten Elemente stehen Dir bis zum Sitzungsende für alle Eingaben zur Verfügung.

Nun vergleiche diesen Workflow mit dem, was hier beschrieben ist: Gramps Wiki Handbuch. Und berücksichtige auch die dabei erforderlichen Kontroll- und Nacharbeiten.

Beste Grüße
HKD
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
gramps , makros , python

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:47 Uhr.