Hilfe für GUI

Plattformunabhängige GUIs mit wxWidgets.
Antworten
CheckOut
User
Beiträge: 14
Registriert: Donnerstag 10. Januar 2008, 17:00

Donnerstag 10. Januar 2008, 17:17

N´abend Leutz.

Ich hoffe mir kann jemand helfen und ich bin im richtigen Forum.

Ich bastel grad ein wenig an einem kleinen GUI und habe inzwischen eine Klasse, welche auch einwandfrei funktioniert und korrekt sein sollte, ein Freund half mir dabei auch nochmal ein bisschen.

Ich habe hier eine Checkbox in der GUI, das ganze ist so realisiert:

Code: Alles auswählen

box_title = wx.StaticBox(self, -1, self.utility.lang.get('checkbox1'))
        box = wx.StaticBoxSizer(box_title, wx.HORIZONTAL)

self.enable = wx.CheckBox(self, -1, self.utility.lang.get('enable'))
        box.Add(self.enable, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(box, 0, wx.EXPAND|wx.ALL, 5)

self.Bind(wx.EVT_CHECKBOX, self.AufCheckboxGeklickt, self.enable)

def AufCheckboxGeklickt(self, evt):
        # Prüft ob angeklickt oder nicht
        if evt.IsChecked(): # zum testen obs klappt
            wx.MessageBox("angeklickt")
        else:
            wx.MessageBox("nicht angeklickt")
Aber meine Frage ist jetzt folgende. Ich möchte gerne das ich, in einer anderen Datei abfragen kann:

Code: Alles auswählen

if checkbox clicked:
mache das und das
else: mache das und das
Kann mir einer sagen wie ich das jetzt so machen kann, das ich z.B. in einer Variable abfragen kann, ob die Box markiert ist oder nicht?

Ein Freund sagte mir, man könne das eventuell so realisieren:
dann könnte man eine variable in der klasse anlegen in der du bei jedem klick immer den aktuellen wert der checkbox schreibst. dann müsste man die datei "datei1.py" in der datei "datei2.py" importieren und könnte dann auf die klasse und dann auf die variable zugreifen.
Vielleicht kann mir da ja jemand helfen.

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

Donnerstag 10. Januar 2008, 19:37

Hallo und willkommen im Forum!

also ich unterstelle mal ein paar Dinge und mache es mal ganz allgemein:
Wenn Du mit "Deiner GUI" den Mainframe der Anwendung der GUI verstehst, und in das entsprechende Modul so etwas wie

Code: Alles auswählen

from submodul import some_method
schreibst, wobei ich unterstelle, das Deine "andere Datei" dieses submodul ist, dann kannst Du some_method folgendermaßen aufrufen:

Code: Alles auswählen

some_method(self) # oder some_method(self.widget)
.
Bei der ersten Variante übergibst Du den "ganzen Mainframe", bei der zweiten nur das Widget, also Deine Checkbox.

Jetzt schreibst Du in das importierte submodul so etwas:

Code: Alles auswählen

def some_method(parent): # oder some_method(widget)
und Du kannst in der entsprechenden Funktion auf Instanzen des Hauptframes, bzw. Dein Wunschwidget zugreifen. Ähnlich kannst Du auch mit Events verfahren. Am einfachsten, wenn Du some_method an Dein Widget bindest.

Im Grunde ist das jetzt ganz allgemein und auch nicht wxpython-spezifisch. Ich hoffe man findet keinen groben Schnitzer und es hilft Dir weiter.

Gruß,
Christian
gras78ix
User
Beiträge: 9
Registriert: Samstag 4. August 2007, 11:35

Freitag 11. Januar 2008, 01:07

also ich hab das so verstanden, dass du die Click-Reaktion an ein anderes Objekt delegieren willst.

Gleich mal zum aufschreiben: für sowas ist ds wichtigste Design Pattern - das Observer Pattern sehr gut geeignet.

die GUI Klasse, die das Event von wxPython empfängt ist hier das Observable - besitzt also eine List von Objekten, die wiederum alle eine notify Funktion besitzen. Das GUI Objekt besitzt nur eine notifyAll Funktion, die die notify Funktion alle registrierten Observer aufruft.

D.h. in der On...Event Funktion des GUI-Observer-Objekts wird einfach die notifyAll Funktion aufgerufen, somit landet die "hier ist jetzt geklickt worden" Information bei den Observern.
Antworten