KontaktDB (Sqlite und PyQt4)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Hallo,

wie im Titel schon geschrieben, eine Kontaktdatenbank,
welche Sqlite zum speichern und PyQt4 für die Gui nutzt.

Zu finden ist das ganze unter:
http://kontaktdb.berlios.de/

EDIT: Aktuelle Version: 1.0.0.6a vom 26. März 2008

aktuelle Änderungen:
http://kontaktdb.berlios.de/history.html

Vom Umfang her sind es etwas über 500 Zeilen.

Kommentare sind ausdrücklich erwünscht!

EDIT:
Neue Webadresse eingefügt. (27.02.2008)
Version aktualisiert. (18.03.2008)
Aktualisiert(26.03.2008)
Zuletzt geändert von use_opensue am Mittwoch 26. März 2008, 18:55, insgesamt 7-mal geändert.
http://kontaktdb.berlios.de/
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Was mir direkt ins Auge springt: Du solltest ein Grid oder ähnliches verwenden, um Eingabefelder und ihre Bezeichner in zwei Spalten anzuordnen.
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Hallo YOGi,

wie meinst du das?
Bisher sind die Labels und LineEdits zeilenweise per
QHBoxLayout verknüpft. Und ein QVBoxLayout fasst die einzelnen Zeilen
zusammen.

Mfg
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Mir ist gerade aufgefallen, dass es ein Problem gibt, wenn der erste Eintrag in die Datenbank eingefügt wird -> das GUI friert ein.

Workaround: einfach das Programm neu starten.

Ich muss gestehen, dass ich nie mit einer leeren Datenbank getestet habe.
Für einen Fix habe ich erst am Freitag nachmittag zeit. :-(

MfG
BlackJack

Oha, viel Quelltext. :-)

Möchte mich an Y0Gi anschliessen, dass man etwas am Layout ändern sollte. Das ist zu starr. Die grösse sollte sich dem Inhalt anpassen. Bei mir sind zum Beispiel nicht alle Texte in Buttons lesbar:

Bild

Wenn ich eine Adresse eingebe und speichern will bekomme ich folgende Ausnahme und eine GUI in der alles "ausgegraut" ist:

Code: Alles auswählen

Traceback (most recent call last):
  File "Kontaktdatenbank.py", line 293, in DS_aenderungen_speichern
    query_str.append(str(Tupel_Liste[aktueller_zaehler[0]][1][0]))
IndexError: list index out of range
Ich würde mal sagen dass Programm funktioniert nicht, wenn die Datenbank noch leer ist, weil dann in `Fenster.set_up()` nichts in `aktueller_zaehler` geschrieben wird.

In der `main()`-Funktion verwendest Du zweimal den Namen `self`, den es dort gar nicht gibt.

Mit dem Sternchenimport von `PyQt4.QtGui` werden über 300 Namen in den Namensraum des Moduls geholt, von denen nur ein Bruchteil verwendet wird.

Wenn ein Quelltextabschnitt schon mit dem Kommentar "globale Variablen" eingeleitet wird… Und dann gibt's auch zwei davon. Eine `Tupel_Liste` wo mir weder aus dem Namen noch aus dem Kommentar klar ist, wozu die gut ist. Und ein `aktueller_zaehler`, eine Liste, die im Laufe des Programms immer nur ein Element enthält, ein hässlicher Workaround um das sowieso schon hässliche ``global`` zu umgehen.

Es gibt schon seit einiger Zeit keinen "richtigen" Unterschied zwischen `int` und `long` mehr. Man braucht bei Konstanten kein ``L`` mehr anhängen. Und warum Du die `id` aus der Datenbank immer zweimal durch das Programm führst verstehe ich auch nicht. Das ganze in Tupeln zu speichern macht den Quelltext nicht unbedingt einfach zu lesen. Das führt zu undurchsichtiger Indexerei wie man in der Ausnahme oben sehen kann.

Bei ``for``-Schleifen über ganze Zahlen tatsächlich immer eine *Liste mit den Zahlen* hinzuschreiben ist, äh, naja Anfänger machen das, bevor sie das Tutorial durchgelesen haben, oder mal irgendwelchen anderen Python-Quelltext mit Schleifen über ganze Zahlen. Es gibt `xrange()`.

In `aktualisiere_lcdNum()` wird von der Länge der `Tupel_Liste` eins abgezogen. Ist da irgendein "Phantom"-Eintrag drin? Das sollte man kommentieren.

`setze_LEs_enabled()`, `get_LEs_text()`, `set_LEs_text()`, `DS_aenderungen_speichern()` könnte man jeweils eleganter mit einer Schleife schreiben. Die Liste der Namen der Felder sollte ein Klassenattribut sein, von dem man sich dann mit `len()` die "magische" Zahl 17 für die Schleifen holen kann, die jetzt über die Listen [1,2,...,16] laufen.

`vorheriger_DS()` und `naechster_DS()` ist nahezu Kopien voneinander, die sollte man zu einer Methode zusammen fassen, oder zumindest die gemeinsamen Teile in eine eigene Methode auslagern.

Die beiden ``del``-Anweisungen am Ende der `main()` sind überflüssig.
Gnushi
User
Beiträge: 77
Registriert: Dienstag 12. Dezember 2006, 09:49

Hi!

Vorschlag, nach dem ich den Screenshot gesehen habe:
Auf der linken Seite könntest du ein QListWidget anbringen, das dir alle Datensätze anzeigt. Selektierte Datensätze könntest du dann exportieren oder löschen, ganz nach Benutzerwunsch. Lediglich zum Eintragen oder Modifizieren bräuchtest du dann den Dialog.

GnuShi
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Hey,

vielen Dank für die Kommentare!

Über QListWidget habe ich schon nachgedacht doch zum Einstieg habe ichs
erstmal gelassen.
An sich ist das aber eine sinnvolle Änderung, die ab sofort auf der Todo Liste
steht.

Beim Layout habe ich zwar Spacer eingefügt, doch Größenänderungen
verpuffen irgendwie im Nichts, dazu muss ich sicher noch ein bischen in der
Doku lesen.
In der GUI sind immer nur die sinnigen Buttons aktiv, das führt mit einer leeren
Datenbank zum "einfrieren", da die Programmausführung abbricht.
Eine Lösung habe ich schon im Kopf, die wird dann am Freitag umgesetzt.

Die globalen Variablen sind böse, und benötigt werden sie eigentlich auch
nicht, das wollte ich mit der nächsten Version beheben.

Warum gibt es zwischen int und long keinen Unterschied mehr?

xrange() kannte ich bis dato nicht.

In "aktualisiere_lcdNum()" wird die Länge von "Tupel_Liste" um eins verringert,
da die Lcds bei Null beginnen.

`setze_LEs_enabled()`, `get_LEs_text()`, `set_LEs_text()`, `DS_aenderungen_speichern()` mit einer Schleife, daran hatte ich gar nicht gedacht, gefallen haben sie mir, so wie sie sind nicht.

Die Vereinheitlichung von `vorheriger_DS()` und `naechster_DS()` war
ebenfalls für die nächste Version geplant.

Zu den "del" Anweisungen kann ich jetzt aus dem Stehgreif nichts sagen, dazu
am Freitag mehr.

Nochmal Vielen Dank, hoffentlich schaffe ich es am Freitag eine bereinigte
Version zu veröffentlichen

Bis Freitag
use_opensu(s)e
BlackJack

`int`\s werden automatisch zu `long`\s wenn das Ergebniss nicht mehr in ein `int` passt. Begründung ist IIRC dass die Unterscheidung zu viel von der Hardware durchblicken lässt und eine zu willkürliche Einschränkung für eine Hochsprache ist.

Bei den LCD-Zahlen hätte ich eher erwartet, dass dort bei Datensatz x von y bei y die Anzahl der Datensätze steht. Also eher x um eins nach oben korrigiert werden sollte als umgekehrt. Keine Ahnung warum ich als Programmierer da einen Start bei 1 erwartet hätte. :-)
DarXun
User
Beiträge: 21
Registriert: Montag 21. Januar 2008, 00:44

Kleiner Hinweis noch zur Seite:

Oben steht "Instalation", also nur mit einem 'l' ;)


Hab's mir ansonsten noch nicht großartig angeschaut, aber die Idee find ich klasse :)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Hier mal grob angedeutet, was ich mit "zweispaltig" meine:

http://img518.imageshack.us/my.php?image=guizu8.jpg

Das Ganze natürlich noch weiter umgesetzt, idealerweise alles auf selber Höhe (in der Breite).

Für Screenshots von Widget-GUI-Anwendungen empfiehlt sich übrigens PNG wegen der verlustfreien Komprimierung deutlich mehr als JPEG.
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

So, eine Version 1.0.0.2 ist online.
Die behebt aber nur den Fehler, mit einer leeren Datenbank, mehr habe ich
gestern Abend nicht geschafft.

Evtl. gibts heute im laufe des Tages Version 1.0.0.3...

@BlackJack: int wird automatisch zu lang, sehr schön, wieder etwas das nicht
vom Eigentlichen ablenkt.

@DarXun: ist behoben.

@Y0Gi: Ahh, jetzt ist mir klar, was du meinst. JPEG VS PNG, macht für mich
keinen Unterschied, ab jetzt dann PNGs.

Verdammt, mir ist gerade wieder etwas ungeschicktes aufgefallen, wird in 1.0.0.3
angepasst(eine überflüssige MessageBox).

Mfg use_opensu(s)e
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Der Unterschied ist, dass JPEG die Screenshots besonders auf einfarbigen Flächen "dreckig macht". Wenn du deinen Screenshot mal vergrößerst, sollte dir das sofort auffallen.
Bei PNG hingegen werden solche Flächen sauber belassen, Kanten bleiben scharf und es besteht zusätzlich die Möglichkeit, die Anzahl der Farben zu reduzieren, was oft viel Platz spart (inbesondere wenn keine Farbverläufe in der Titelleiste sind oder ähnlicher Firlefanz).
Zuletzt geändert von Y0Gi am Samstag 15. März 2008, 13:00, insgesamt 1-mal geändert.
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Mit nur einem Tag Verspätung( fast so gut wie die Bahn ;-) )
ist Version 1.0.0.3 verfügbar.

Hier nochmal die Url: http://kontaktdb.berlios.de/index.de.html

Änderungen:
- GUI vereinheitlicht
- xrange() wird genutzt
- Sternchenimport von PyQt4 entfernt
- gleicher Kode von "vorheriger_DS()" und "naechster_DS()" in "anderer_DS" ausgelagert
- int / long angepasst
- globale Variablen entfernt

In Version 1.0.0.4 will ich die Methoden `setze_LEs_enabled()`, `get_LEs_text()`,
`set_LEs_text()`, `DS_aenderungen_speichern()` nach den Anmerkungen von
BlackJack umgestalten, sowie die Anwendung für Internationalisierung fit machen.

Nebenbei verschwinden dann auch Texte wie "ae" und co.

In Version 1.0.1.z will ich eine Suchfunktion haben, und in Version 1.1.y.z soll
die GUI ein QListWidget sein...

Soweit so gut, Kommentare sind nach wie vor gern gesehen
use_opensu(s)e
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Hey,

ich suche Übersetzer für die KontaktDB.

Das ganze geht ganz einfach mit dem Qt Linguist.

Wenn jemand Interesse hat, einfach melden.

Version 1.0.0.4 ist bis auf zwei schönheitsfehler fertig.
http://kontaktdb.berlios.de/
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

So Version 1.0.0.4 ist veröffentlicht.

Ich freue mich auf Kritik und Übersetzer :P
http://kontaktdb.berlios.de/
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

So Version 1.0.0.5 ist ab sofort verfügbar!

Es gibt eine Suchfunktion, eine verbesserte Oberfläche, sowie diverse
Übersetzungen. Auch sollte KontaktDB jetzt PEP08 konform sein.

KontaktDB ist aktuell in folgenden Sprachen verfügbar:
Englisch
Deutsch
Französisch*
Spanisch*
Italienisch*
Portugiesisch*

Die mit dem * gekennzeichneten Übersetzungen sind automatisiert
entstanden, und können deshalb fehler enthalten.

Ich suche nach wie vor noch Übersetzer / Mitstreiter.

Wer Fragen oder Anmerkungen hat, einfach hier stellen oder per Email
an mich (q000te AT users.berlios.de).

Mfg
use_opensu(s)e
http://kontaktdb.berlios.de/
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Hier mal eine Vorschau auf die nächste Evolutionsstufe:

Bild

Was haltet ihr davon?
http://kontaktdb.berlios.de/
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

use_opensue hat geschrieben:Was haltet ihr davon?
Sieht aufgeräumt aus, meiner Meinung nach! :)
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Ab jetzt ist KontaktDB Version 1.0.0.6a verfügbar!

Version 1.0.0.6 habe ich nicht veröffentlicht(bug).

1.0.0.6a bringt ein Zusatzfenster, welches die Datensätze in einer Liste darstellt,
dies vereinfacht die Handhabung von vielen Datensätzen enorm.

Die Internetseite habe ich auch erneuert.

Ebenso gibt es einige Installer.

Rückmeldungen entweder hier im Forum, oder an q000te AT users.berlios.de

Hier ein Screenshot:
Bild

mfg use_opensu(s)e
http://kontaktdb.berlios.de/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nachmane?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten