staging.inyokaproject.org

Skript zum Import von Fotos von der Kamera

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

chris109

(Themenstarter)
Avatar von chris109

Anmeldungsdatum:
12. Juni 2006

Beiträge: 374

Ich habe das Skript mit Python/GTK komplett neu geschrieben.

Es ist jetzt einfacher einzurichten und hat eine schönere Benutzeroberfläche. Ich werde es noch weiter verbessern, da es vor allem ein Lernprojekt ist. Die Aufgabe und eigentliche Funktion ist sehr einfach. Das drumherum aber nicht.

Das sind meine Ziele:

  • Optimale Benutzerführung erreichen

  • GTK beherrschen

  • Mehrsprachige Software schreiben

  • Pakete für verschiedene Distributionen erstellen

Wenn mir jemand Tipps geben kann oder Verbesserungsvorschläge hat, rennt er bei mir offene Türen ein. 😉

LittlePhotoCopy.tar.gz (5.9 KiB)
Download LittlePhotoCopy.tar.gz

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

chris109 schrieb:

Wenn mir jemand Tipps geben kann oder Verbesserungsvorschläge hat, rennt er bei mir offene Türen ein. 😉

Ich habe mir den Sourcecode noch nicht angesehen, aber schon mal einen Tipp: Quickly! Das ist ein Framework, um einfach PyGTK-Anwendungen für Ubuntu zu schreiben. Ich habe das hier mal ausführlicher vorgestellt: http://my.opera.com/freedo/blog/2010/05/24/mal-schnell-was-programmieren

Ich selbst benutze Quickly mittlerweile für alle meine Projekte, und es ist wirklich hilfreich, da es das ganze Drumherum (Internationalisierung, Paketbau, Grundgerüst für GTK) übernimmt und man sich so ganz auf die eigentliche Programmierung konzentrieren kann. So nebenbei lernt man von den Quickly-Vorlagen auch ein paar Best-Practice-Techniken, was PyGTK angeht.

Liebe Grüße
Fredo

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

So, ich habe mir den Quelltext noch mal etwas angeguckt. Ich bin sicherlich nicht der große Informatiker, aber ein bisschen Übung mit PyGTK habe ich schon. Daher sind meine Anmerkungen als subjektive Einschätzungen zu verstehen, vielleicht haben andere Leute andere Ansichten.

Was mir spontan aufgefallen ist:

Kommunikation zwischen „Frontend“ (UserInterfaceGTK) und „Backend“ (LittlePhotoCopy): So habe ich das bei meinen ersten Versuchen auch gemacht, dass die Kommunikation über Methodenaufrufe funktioniert. Deutlich flexibler ist meines Erachtens das Verwenden von Signalen. Du kannst z.B. von GObject ableiten, dann hast Du gleich die Signal-Handling-Möglichkeiten von GObject. Ganz gut ist das hier beschrieben: http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm Meiner Meinung nach kann man den Teil zu Properties überspringen, da ich Python-Properties netter finde als GObject-Properties, aber der Teil zu Signalen ist recht hilfreich.

Die Kommunikation würde ich mir dann wie folgt vorstellen: Man ruft die GUI auf und die erzeugt da Backend (LittlePhotoCopy() oder so), verbindet sich zu deren Signalen („progress“ z.B.) und startet die Operation (LittlePhotoCopy.run() oder so). Der Signal-Handler ist dann dafür zuständig, die Informationen vom Backend in der GUI anzuzeigen (z.B. einen Fortschrittsbalken). Der Vorteil ist auch, dass man Threading quasi gratis bekommt, somit hat man auch keine Probleme, die GUI zu aktualisieren, während im Backend ein längerer Prozess läuft.

GUI-Design allgemein: Ich finde, dass Du Dich noch ein bisschen zu sehr am zenity-Frage-und-Antwort-Spiel orientierst. Ein richtiges Programm hat im Idealfall ein Hauptfenster, von dem aus man alle Einstellungen etc. vornehmen kann (ggf. über Dialoge, die vom Hauptfenster aus aufgerufen werden), und wenn alles fertig ist, stoße ich die Übertragung an. Diese Dialog-Folge irritiert mich dagegen eher.

Das so zum grundsätzlichen Design, ansonsten habe ich noch ein paar Detailanmerkungen:

  • Geschmäcker sind da verschieden, aber ich finde Glade/gtk.Builder für das Interface deutlich netter als alles programmatisch zu erzeugen.

  • Die ganzen Fehlertests und „message“-Konstruktionen erscheinen mir etwas intensiv, ich würde das eher über trial and error (sprich: try/except) laufen lassen. Lieber eine gute Fehlerbehandlung als zig Dinge im Vorhinein abtesten. Besonders auffällig ist das bei den „success“-Konstruktionen: Warum erst den Fehler abfangen und dann success = False zurückgeben, anstatt gleich die Exception in der aufrufenden Funktion zu behandeln? Auch ein reines „except“ ist nicht empfehlenswert, besser die konkreten Exceptions abfangen.

  • String-Aneinanderkettung (Wie in den message-Fällen) ist nicht unbedingt performant. Es ist daher allgemein empfohlen, Strings in einer Liste zu sammeln und die am Ende über ''.join(liste) zusammenzufügen.

  • Ebenso sind Dinge wie "Quellenverzeichnis " + source + " nicht verfügbar." nicht so hübsch, besser ist "Quellenverzeichnis %s nicht verfügbar." % source. Das ist auch wichtig für die Lokalisierung, da man solche zerstückelten Strings kaum übersetzen kann.

  • Anstatt die Konfigurationsdatei auf händischem Wege zu schreiben, würde ich dafür auch die ConfigParser-API nutzen.

Das sind so die Sachen, die mir ganz grob aufgefallen sind. Vielleicht hilft Dir das eine oder andere ja weiter.

Liebe Grüße
Fredo

chris109

(Themenstarter)
Avatar von chris109

Anmeldungsdatum:
12. Juni 2006

Beiträge: 374

Hallo Fredo!

Danke für die Umfangreiche Rückmeldung. Ich habe tatsächlich noch nicht viel Erfahrung mit Python und bin deher für jeden Tipp dankbar.

Zum Grundsätzlichen Design:

Du hast sicher recht, dass GUI und Backend getrennte Prozesse sein sollten, schon allein deshalb, weil das kopieren großer Dateien die GUI störend blockiert. Den Mechanismus mit Signalen werde ich mir mal ansehen.

Die Trennung von GUI und Funktion soll nach Prinzip der [Fassade http://de.wikipedia.org/wiki/Facade] gestaltet sein. Da ich langfristig verschiedene Frontends anbieten möchte. Mein Traum ist unter anderem ein Mediacenter bzw. einen VDR damit auszustatten.

Vom Frage-Antwort-Spiel möchte ich eigentlich nicht abweichen. Das Programm ist immerhin primär für meinen Vater entworfen, der mit umfangreichen Dialogen seine Schwierigkeiten hat. Schon der Speichern-Dialog von Gnome-Programmen überfordert ihn im Grunde. Vielleicht finde ich aber noch eine elegantere Möglichkeit. Auf jeden Fall darf ich dem Benutzer nicht mehr als genau eine Option/Frage gleichzeitig anbieten, auf die er seine Aufmerksamkeit richten kann.

Alles weitere:

  • Das mit den Strings, kannte ich bisher einfach nicht und war zu faul danach zu suchen. In Zukunft werde ich das aber ändern. Danke 😉

  • Die Abfragen beim Start sind deshalb so wichtig, weil das Programm von vornherein wissen soll, ob alle Voraussetzungen für einen korrekten Ablauf gegeben sind und dem Benutzer vorher sagen kann ob alles funktioniert oder nicht. Ich sehe aber auch, dass es nicht besonders "gut aussieht" wenn man auf den Code schaut.

  • Das ConfigParser-API werde ich mir mal genauer ansehen. Danke für den Tipp.

Noch eine Anmerkung:

Für mich persönlich ist dieses Programm deshalb so interessant, weil die Aufgabe nur technisch sehr simpel ist, der Anspruch aber trotzdem enorm hoch. Technisch könnte man das Problem mit einem Dreizeiler lösen. Der Anspruch ist aber dem Benutzer die Aufgabe komplett abzunehmen und ihm zu ersparen mitdenken oder verstehen zu müssen. Der Computer erledigt die Aufgabe, wenn man die Kamera ansteckt und der Computer weiß was er tut.

Wenn Du noch mehr Ideen oder Vorschläge hast, würde ich mich über Vorschläge oder konkreten Code freuen. Ich weiß ja nicht wie weit Dich die Herausforderung, der ich mich hier stelle, persönlich interessiert.

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

chris109 schrieb:

Zum Grundsätzlichen Design:

Du hast sicher recht, dass GUI und Backend getrennte Prozesse sein sollten, schon allein deshalb, weil das kopieren großer Dateien die GUI störend blockiert. Den Mechanismus mit Signalen werde ich mir mal ansehen.

Die Trennung von GUI und Funktion soll nach Prinzip der [Fassade http://de.wikipedia.org/wiki/Facade] gestaltet sein. Da ich langfristig verschiedene Frontends anbieten möchte. Mein Traum ist unter anderem ein Mediacenter bzw. einen VDR damit auszustatten.

Ja, das sollte mit GObject möglich sein. Das Backend muss dann nämlich gar nicht wissen, welche Möglichkeiten zur Anzeige etc. das Frontend hat, es feuert einfach nur entsprechende Signale, die das jeweilige Frontend (GTK-Anwendung, VDR, etc.) auswertet.

Vom Frage-Antwort-Spiel möchte ich eigentlich nicht abweichen. Das Programm ist immerhin primär für meinen Vater entworfen, der mit umfangreichen Dialogen seine Schwierigkeiten hat. Schon der Speichern-Dialog von Gnome-Programmen überfordert ihn im Grunde. Vielleicht finde ich aber noch eine elegantere Möglichkeit. Auf jeden Fall darf ich dem Benutzer nicht mehr als genau eine Option/Frage gleichzeitig anbieten, auf die er seine Aufmerksamkeit richten kann.

Ok, verstehe. Es ist halt nicht das übliche GUI-Design, daher hatte es mich zunächst etwas irritiert. Aber es soll ja offenbar auch keinen üblichen Zweck erfüllen, und dann macht es natürlich Sinn, ein Design zu wählen, dass am besten passt (sprich: das Dein Vater am besten versteht).

  • Die Abfragen beim Start sind deshalb so wichtig, weil das Programm von vornherein wissen soll, ob alle Voraussetzungen für einen korrekten Ablauf gegeben sind und dem Benutzer vorher sagen kann ob alles funktioniert oder nicht. Ich sehe aber auch, dass es nicht besonders "gut aussieht" wenn man auf den Code schaut.

Ja, verstehe. Auch nicht das übliche Design, aber in dem Fall mit der Dialog-Abfolge ist es vermutlich auch nicht sehr hübsch, wenn man nach all den Fragen und Antworten auf einmal eine Fehlermeldung bekommt und man von vorne anfangen darf. 😉

  • Das ConfigParser-API werde ich mir mal genauer ansehen. Danke für den Tipp.

Zum Lesen verwendest Du es ja schon, wenn ich mich recht erinnere. Dann musst Du es nur noch zum Schreiben der Konfigurationsdatei auch benutzen.

Noch eine Anmerkung:

Für mich persönlich ist dieses Programm deshalb so interessant, weil die Aufgabe nur technisch sehr simpel ist, der Anspruch aber trotzdem enorm hoch. Technisch könnte man das Problem mit einem Dreizeiler lösen. Der Anspruch ist aber dem Benutzer die Aufgabe komplett abzunehmen und ihm zu ersparen mitdenken oder verstehen zu müssen. Der Computer erledigt die Aufgabe, wenn man die Kamera ansteckt und der Computer weiß was er tut.

Wenn Du noch mehr Ideen oder Vorschläge hast, würde ich mich über Vorschläge oder konkreten Code freuen. Ich weiß ja nicht wie weit Dich die Herausforderung, der ich mich hier stelle, persönlich interessiert.

Ich habe ja, wie in einem früheren Beitrag geschrieben, mit fast der gleichen Motivation angefangen, mir PyGTK anzueignen. Auch da habe ich als erstes ein Kamera-Import-Programm für meine Eltern geschrieben. Das Problem stellt sich mir jetzt so nicht mehr, da meine Eltern eine gute Lösung gefunden haben, deswegen würde ich vermutlich nicht konkret bei Deinem Programm mitarbeiten. Dafür habe ich selbst noch zu viele Baustellen offen. Aber für eine Diskussion über gutes Anwendungsdesign bin ich durchaus zu haben. Wenn Du also im Laufe des Projektes an irgendwelche Fragen kommst, bin ich gerne bereit, mir das einmal anzusehen und zu überlegen, ob ich dazu eine Idee habe.

Liebe Grüße
Fredo

Antworten |