Fertigstellen eines Programmes-meherer Fragen (GUI, Errors)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Hallo!

Ich bin jetzt im groben mit meinem ersten Programm fertig und habe noch einige Fragen. Generell funktioniert alles, ich wurde aber von CM darauf hingewiesen, dass Programmlogik und GUI gemixt sind. Hier brauch ich euren Rat:

1) Also ich habe eine Notebook das meherer Tabs hat. Jeder Tab entspricht ein Unterprogramm (Lösungsberechner, Unit Converter usw.).
Wie muss ich mir das jetzt vorstellen?
Soll ich 2 Scripte schreiben, wobei in dem ersten die komplette GUI für das Notebook plus alle Unterprogramm und in dem zweiten die komplette Programmlogik untergebracht ist? Würdet ihr das so machen? Wird es so gehandhabt, dass Programmlogik und GUI je ein Script bekommen? Oder werden sie zusammengeworfen?
Wie findet man dann schnell heraus welcher Button zu Unterprogramm 3 gehört-schreibt man alle Buttons untereinander oder erst der ganze Kram für die GUI von Programm 1, dannach das zweite usw?

2) Desweiteren habe ich eine Frage zu bekannten Errors (z.B. User gibt keinen Wert ein). Fügt man dann für jeden Fall einfach ein Try...Except an Stelle x ein? Das sieht irgendwie unschön aus und kann ja auch recht häufig vorkommen.

3) Ich bin gerade dabei mich mit cx_freeze zu beschäftigen. Funktioniert das dann auch mit meheren Scripts plus txt Files (z.B. für meinen Unit Converter)?Muss sich dann idealerweise alles im selben Ordner wie das Hauptscript befinden?

Hier mal mein Programm, momentan noch sehr unschön aber wenigstens funktionstüchtig :D Achja ohne Unit Converter, weil die Einheiten alle in mehreren txt Files vorliegen. Und ohne readme.

Notebook
http://paste.pocoo.org/show/15197/
mol_arbeit.py
http://paste.pocoo.org/show/15198/
tm_arbeit.py
http://paste.pocoo.org/show/15199/

Wie gesagt momentan gehts nur um die Planung nicht um das fertige Programm :)

Ich hoffe jemand kann mir ein bisschen helfen!?
Andere Kritik ist natürlich auch willkommen :wink:

Liebe Grüsse
Stefanie
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Ich handhabe es so, daß ich für jedes (Unter-)Programm eine Hauptklasse (ggft. noch mehrere andere) habe, die die Schnittstellen für Benutzeroberflächen oder andere Programme zur Verfügung stellt. Dazu gibt es dann ein extra Skript, daß die Oberfläche für das Programm zur Verfügung stellt und die Hauptklasse "bedient". Die Hauptoberfläche selbst ist dann noch einmal in einer separaten Datei untergebracht.

Was cx_freeze betrifft: Es bindet alles ein, was in der angegebenen Datei importiert wird, bzw. von den Importierten importiert wird. Eventuell mußt du auf encodings aufpassen, die importiert er nach meiner Erfahrung nicht automatisch. Alles, was nicht unmittelbar zum Programm gehört (.txt, .cfg ...) mußt du nach dem freezen manuell ins Ausgabeverzeichnis kopieren.
Pablo Escobar
User
Beiträge: 21
Registriert: Montag 12. November 2007, 15:15
Wohnort: Stuttgart

ete hat geschrieben:
1) Also ich habe eine Notebook das meherer Tabs hat. Jeder Tab entspricht ein Unterprogramm (Lösungsberechner, Unit Converter usw.).
Wie muss ich mir das jetzt vorstellen?
Soll ich 2 Scripte schreiben, wobei in dem ersten die komplette GUI für das Notebook plus alle Unterprogramm und in dem zweiten die komplette Programmlogik untergebracht ist? Würdet ihr das so machen? Wird es so gehandhabt, dass Programmlogik und GUI je ein Script bekommen? Oder werden sie zusammengeworfen?
Versteh ich das richtig und dir gehts ums reine Design des Quellcodes?
(Wenn nicht brauchst du ab hier nicht weiterlesen, das wär verschwendete zeit und mein beitrag wär absoluter non-sense und könnte gelöscht werden)
bin jetzt nicht der programmier spezialist, und vorallem nicht im hinblick auf python, aber :
falls ich das richtig verstanden hab, was ich ernsthaft bezweifel, geht es um die modularisierung eines programmes,
welches ja nicht wirklich mit der programmiersprache zu tun hat.
ich persönlich würde es so machen, wie es mir selbst am übersichtlichsten&sinnvollsten erscheint und mich nicht an anderen messen.
zum Beispiel kannst du in einem Modul deine Gui bearbeiten
und in nem anderen deine Programmlogik etc pp.
meiner meinung solltest du einfach selbst gucken,
wie strukturiere/gliedere mein programm am sinnvollsten,
und wie erschaffe ich eventuell eine unabhängigkeit, um gegebene module in anderen programmen nutzen zu können
vielleicht möchtest du die gui, ja noch in anderen Programmen verwenden,
dann wär es praktisch wenn sie von der programmlogik her unabhängig ist.

hoffe, dass ich einigermaßen den punkt getroffen hab und ich nicht absoluten non-sense geschrieben hab.
ansonsten tut es mir echt leid und ich bitte vielmals um entschuldigung

lg
Pablo
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi Stefanie,

habe mich ja eigentlich schon mal zum Thema ausgelassen, aber nochmal kurz:
ete hat geschrieben: 1) ...
Soll ich 2 Scripte schreiben, wobei in dem ersten die komplette GUI für das Notebook plus alle Unterprogramm und in dem zweiten die komplette Programmlogik untergebracht ist? Würdet ihr das so machen? Wird es so gehandhabt, dass Programmlogik und GUI je ein Script bekommen? Oder werden sie zusammengeworfen?
Nein, GUI und Programlogik trennen bedeutet nicht, daß aller GUI-Code in einer Datei sein muß. Die meisten Programme machen es so: Eine Datei für den GUI-Mainframe, je eine Datei für jeden Dialog, Notebook, etc. (vielleicht mit Ausnahme von Standarddialogen, die nur wenige Zeilen Code kosten. Vorteil: Übersicht. Wenn ein Fehler passiert, weißt Du sofort wo was ist - auch bei größeren Projekten. Gutes Design vorausgesetzt kannst Du dann auch noch schnell Abhilfe schaffen. Logik entweder in Form von Funktionen in (separaten) Datei(ein) (je nachdem) oder wenn Deine GUI mit best. Objekten hantiert auch in Form einer Klasse mit versch. Methoden. Letzteres halte ich bei Dir für angebracht. Warum nicht eine Klasse 'DNA' oder 'Primer' schreiben?
Ggf. hilft es Dir im wiki von wxPython zu stöbern (ist allerdings nicht so dolle) oder in das Buch zu wxPython zu investieren.
ete hat geschrieben: 2) Desweiteren habe ich eine Frage zu bekannten Errors (z.B. User gibt keinen Wert ein). Fügt man dann für jeden Fall einfach ein Try...Except an Stelle x ein? Das sieht irgendwie unschön aus und kann ja auch recht häufig vorkommen.
Eine gute GUI macht alles für seine Nutzer ;-). Ich würde schon versuchen so viele Fehler wie möglich abzufangen. Dein Logikteil kann auch eigene Fehler werfen - das macht es Dir noch einfacher spezifisch zu werden. Was kostet es Dich an Code? Fast nichts: Du informierst einfach die Nutzer über die Art des Fehlers und ggf. wie er zu umgehen ist. Einfach eine Nachricht an einen wx.MessageDialog und fertig. Etwas Pseudocode:

Code: Alles auswählen

try:
    x = open(path)
    datasets.append(x)
except X_IOError, msg:
     # die nächsten 3 Zeilen kann man beim refactorn auch zusammenfassen
     # wenn es mehrfach vorkommt.
     mss = wx.MessageDialog(self, "Error opening file: %s\nError message:\n%s" % (path, msg.value), 'Error opening file', wx.OK|wx.ICON_ERROR)
     mss.ShowModal()
     mss.Destroy()
except X_X_Error, msg:
     ...
except:
     mss = wx.MessageDialog(self, "Unknown exception opening: %s\nError message:\n%s" % (path, msg.value), 'Error opening file', wx.OK|wx.ICON_ERROR)
zu 3) Weiß ich grad nicht, aber man könnte solche Fragen mit einem ganz anderen Thema auch in einem ganz anderen Thread abhandeln - dann behalten alle einfacher die Übersicht.

Gruß,
Christian
Antworten