BlackVivi hat geschrieben:die einzelnen Bestandteile in eigene Funktionen ausgelagert.
Hallo BlackVivi!
Ich kann dir nur sagen was ich davon halte und wie ich es mache. Das soll nur eine Empfehlung sein.
Ich brauche länger um Dinge wieder zu finden wenn ich die Erstellung der GUI auf mehrere Funktionen verteile. Für mich ist es also viel schwerer, das Programm zu durchschauen und Fehler zu finden, wenn ich den GUI-Aufbau auf mehrere Funktionen verteile. Außerdem ist es auch mehr Schreibarbeit. Du musst Vieles in Instanzvariablen halten und musst dich immer darum kümmern, dass die benötigten Objekte auch wirklich an die Funktionen übergeben werden. -- Es macht die GUI-Erstellung, in meinen Augen, komplizierter, wenn diese auf mehrere Funktionen aufgezeilt wird.
Ein Frame bekommt bei mir immer eine eigene Klasse. Oft verwende ich für Panels, mit vielen Widgets oder einer eigenständigen Funktion, ebenfalls eigene Klassen. Also immer dann, wenn etwas gut abgetrennt werden kann (z.B. die Panels, die in ein Notebook gelegt werden), dann bekommt es eine eigene Klasse spendiert. Ich schreibe dir dafür noch ein kleines Beispiel. Später.
Zu diesem Codeschnipsel habe ich auch noch etwas zu sagen:
Code: Alles auswählen
class Frame(wx.Frame):
def __init__(self, parent=None, id=-1, pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE,
title="", name="frame" ):
wx.Frame.__init__(self, parent, id, title, pos, size, style)
Dir sollte klar sein, dass "Frame" kein guter Name für ein Frame ist.
Mehr braucht man meistens nicht zu übergeben. Es ist nicht notwendig jeden Müll rum zu schleppen, wenn er sowiso kaum oder nie gebraucht wird.
- id: Wird nie gebraucht
- pos: selten. Und wenn doch, dann kann man es immer noch in die __init__ integrieren
- size: Wenn man alles richtig macht, dann braucht man size so gut wie nie. Die Größe des Frames wird meistens dynamisch von den darin enthaltenen Widgets bestimmt. Man braucht size nur in Ausnahmefällen. Und in diesen Fällen kann man es immer noch in die __init__ integrieren.
- style: (wie pos)
- name: Wird so gut wie nie gebraucht
Code: Alles auswählen
def Menu(self):
...
def Bindings(self):
...
def OnMenuQuit(self, event):
...
Dazu auch noch ein Wort:
"Menu" ist ein Ding, ein Objekt. Aber kein Name für eine Funktion, die etwas macht. Was macht sie denn?
"Bindings" ist irgendetwas, aber keine Funktion, die Bindings erstellt. Das ist aus diesem Namen nicht ersichtlich. Gute Namen erhöhen die Lesbarkeit deines Codes.
Du willst sicher von einem Menüpunkt aus das Frame schließen. Du willst evt. auch von einem Button einer Toolbar aus dein Frame schließen. Vielleicht möchtest du nach getaner Arbeit dein Frame auch automatisch schließen. Schade, dass du "OnMenuQuit(self, event)" nur als Eventhandler für das Menü verwenden kannst.

Wenn du deine Methode so definierst, dann kannst du sie für alle Anwendungsfälle verwenden, in denen du das Frame schließen willst.
``event = None`` --> damit lässt du auch zu, dass die Methode direkt, also nicht als Eventhandler aufgerufen werden kann.
Meine Vorschläge: Wobei ich aber zu bedenken gebe, dass ich persönlich das Menü und die Bindings in __init__ erstelle um beim Durchlesen des Codes ein flüssigeres Bild vor Augen zu haben (ohne ständig hin und her springen zu müssen).
Code: Alles auswählen
def create_menu(self):
...
def create_bindings(self):
...
def close_frame(self, event = None):
self.Close(True)
Aber jetzt mal Schluss.
mfg
Gerold
