wx.Frame und SetUserData

Plattformunabhängige GUIs mit wxWidgets.
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich versuche gerade, einem Formular ( wx.Frame ), Benutzerdaten zu übergeben, heißt also, ich muß von einem anderem Frame, per Button bestimmte Daten an ein neues Frame senden. Mein Frame öffne ich so:

Code: Alles auswählen

    def button_bearbeiten_clicked(self, event): # wxGlade: auftrags_liste.<event_handler>
        wx_auftrags_details = auftrags_details.auftrags_details(None, -1, "")
        spalte = self.list_ctrl_auftraege.GetNextSelected (-1)
        daten_id = self.list_ctrl_auftraege.GetItem(spalte, 0).GetText()
        werte = {
			"daten_id" : daten_id
			}
        # wx_auftrags_details.SetUserData (daten_id)
        wx_auftrags_details.Show()
        event.Skip()
Als erstes dachte, ich, könne gleich am Anfang:
wx_auftrags_details = auftrags_details.auftrags_details(None, -1, "")
noch eine Variable mit schicken. Funtzt natürlich nicht. In der Wiki laß ich das es eine Methode SetUserData gibt. Diese habe ich versucht zu benutzen, aber ohne Erfolg, da ich immer die Meldung bekomme, das es diese Methode nicht geben würde. Weiß jemand von Euch, wie ich benutzerdefinierte Daten an ein Frame weiterleiten kann? Ich könnte diese natürlich erst speichern, in eine Datei und dann wieder aus der Datei heraus holen, jedoch ist das wohl nicht der richtige Weg. Weiß jemand einen Rat?
BlackJack

@The Hit-Man: Man sieht an dem Quelltext ja überhaupt nicht um was für Typen es sich handelt. Und was Du machen willst, wird auch nicht so ganz klar.

Daten von einem Frame per Button an einen anderen zu senden hört sich auch nicht so besonders "gesund" an. Das klingt nämlich so als wenn alles irgendwie in der GUI gespeichert wird und es kein Modell gibt.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

naja, muß nur eine ID zum anderen Frame senden. Wüßte jetzt keine andere Lösung. Die Sache sieht so aus. Ich habe ein HauptFrame, in dem einige Datensätze angezeigt werden. Nun soll bei einem DoppelKlick, oder per Button, Details zu diesem Datensatz angezeigt werden ( in einem neuen Frame ). Um den Datensatz aber anzeigen zu lassen oder wiederzufinden, brauche ich ja seine ID. Diese wollte ich dem Unterframe ( Details ), zusenden, damit auch die richtigen Details angezeigt werden können oder gibts da was besseres?
BlackJack

@The Hit-Man: Dann bräuchte der Detail-Frame eine Methode die eine ID entgegen nimmt und daraufhin seinen Inhalt aktualisiert.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Genau so stelle ich mir das ja vor und dachte eigentlich das es die Methode SetUserData machen würde. Ich weiß nur gerade nicht, wie ich dem Frame eine neue Methode bei bringe.
BlackJack

@The Hit-Man: Woher soll diese Methode denn wissen was der Frame enthält, was die ID bedeutet, die Du da übergeben willst, und wo und wie er an die Daten kommt, um den Inhalt zu aktualisieren!? Ein bisschen viel Magie auf einmal. Um so einen Methode musst *Du* den Detail-Frame schon selbst erweitern.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Das ist ja gerade das Problem, das ich nicht genau weiß, wie ich das mache.
BlackJack

@The Hit-Man: Vererbung.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ja, das sagt mir was. Überlege allerdings ob es sinnvoller wäre, einige Daten, wie zum Beispiel eine solche ID, in eine Datei zu speichern und diese dann wieder mit dem Details-Frame raus zu holen. Zu mal könnte ich auch mehrere Sachen in einer solchen Datei ablegen.

@BlackJack
Wie siehst du das, was wäre denn eleganter?
BlackJack

@The Hit-Man: Das wäre IMHO definitiv *weniger* elegant. Und wenn Du mehr als eine ID übergeben willst, brauchst Du da sicher auch keine Datei, sondern man könnte ja auch mehr als eine ID an eine Methode übergeben. Wobei das auch nicht so toll wäre. Dem GUI-Element/Controller sollte in der Regel nur ein Signal gegeben werden, dass sich etwas verändert hat, oder eben so etwas wie eine ID. Die Informationen die dann neu dargestellt werden, holt sich der Controller dann aus dem Modell.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich könnte ein komplettes Dic an ein Element senden oder wie gesagt auch speichern. Ich denke mir allerdings wenn ich die Daten in eine Datei speicher, dann würden die beiden Frames auch unabhängig von einander laufen wenn dann eben diese Datei exestiert. Das sehe ich im Moment als Vorteil an. Aber trotzdem würde mich interessieren, wie ich einem Control eine neue Methode einrichten kann. Ich nutze ja im Moment wxGlade ( habe mich dran gewöhnt, obwohl es wohl besser wäre, die Frames per Hand zu schreiben ) und da habe ich nur die Möglichkeit eine neue Eigenschaft anzulegen. Diese müßte ich doch auch einfach schreiben und lesen können. Nur irgendwie ist die Eigenschaft nicht bekannt. Wenn ich nun hier mein Frame habe und eine Eigenschaft Test mit angelegt habe:

Code: Alles auswählen

wx_auftrags_details = auftrags_details.auftrags_details(None, -1, "")
müßte ich doch mit:

Code: Alles auswählen

wx_auftrags_details.Test (0)
die neue Eigenschaft beschreiben können. und nach einem:

Code: Alles auswählen

wx_auftrags_details.Show()
mit meinem Details Frame mit self wieder auslesen können oder?
BlackJack

@The Hit-Man: Ich mag ja generierten GUI-Code nicht besonders. Am saubersten wäre es von so einer generierten Klasse zu erben und die dann dort zu erweitern. Auch wenn man bei wxglade wohl auch den generierten Quelltext in Grenzen verändern kann, ohne dass die Änderungen beim Aktualisieren verloren gehen. Das wird über die Kommentare geregelt. Aber mir wäre es zu unsicher und unübersichtlich. Ich würde generierten Quelltext von selbst geschriebenem trennen.

Oder es eben im Controller zu lösen. Controller wie im Model-View-Controller (MVC) Entwurfsmuster. Der wird ja nicht automatisch generiert, den muss man selber schreiben. Dann kann man statt Quelltext zu generieren, in wxGlade auch als XRC ("xml recource") speichern.

Das wxPython-Demo enthält Beispielquelltext zu mehr Widgets als man mit wxGlade zusammen klicken kann. Man schränkt sich dadurch auch ein wenig ein.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich bin ja noch kein Profi-Programmierer und ich fange ja fast unten an. Bin ja schon froh, das ich Controlls mit nem bischen logik dahinter programmieren kann. Suche mir immer alles mühsam aus dem Netz zusammen. Richtig programmieren lernste eh, wie beim Auto fahren erst wenn du es ganz alleine machst.
Ich gebe offen zu das VisualStudio ist echt nen geniales Teil wenn es um Windows Apps geht. Da kannste mal eben schnell was zusammen kloppen ob das nun gut ist oder nicht. Es ist sogar für Anfänger geeignet.
Ich nutze aber schon seit Jahren, privat immer ein Debian und würde ganz gerne damit programmieren. Das Programm, das ich schreibe, soll später unter Windows laufen, d.h. auch python+wxwidgets. Spielt ja hinterher keine Rolle mehr, unter welchem OS was programmiert wurde. Ich gebe dann nur noch die .py Dateien ab. Bin gerade dabei ( weil so weit stehen erst mal die Frames ), mit die dlls rauszusuchen um ein .zip mit meinem Programm zu erstellen. Wenn du wxwidgets unter Windows installierst, werden noch einige dlls in den Systemordner geschrieben und wenn die nicht mit im .zip sind, gibts natürlich auch Probleme.
Du weißt nicht zufällig, welche dlls ich für wxwidgets alle brauche, also mit ins .zip packen muß? Denn so zu suchen, ist nen bischen mühseelig.
BlackJack

@The Hit-Man: Eine "standalone" Windowsanwendung war bisher noch nicht eines meiner Ziele. Wenn dann würde ich mich aber wohl mit py2exe oder PyInstaller auseinandersetzen. Man wäre ja nicht der erste der so etwas macht, also gibt es da sicher auch Informationen im Netz drüber.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

@BlackJack:

das mit dem PyInstaller hat wunderbar geklappt, gleich beim ersten mal. Da siehste dann auch, welche dlls gebraucht werden. Die sucht der sich wohl selber raus.

Aber vielleicht noch ne kurze Frage zu den wxwidgets. Ich nutze auch wxDialog. Mit einem eigenen Close-Button, kann ich den Dialog auch ohne Probleme schließen, allerdings nicht mit dem Kreuzchen ( oben rechts am Fenster ). Es schließt sich zwar, jedoch sieht es aus, als wenn es nur versteckt wäre. Ich komme also nicht aus der Schleife raus. Gibt es nicht ein onClose Event, das ich einfach anbinden kann? Irgendwann hatte ich das mal hinbekommen und finde die Lösung nicht mehr wieder :(

EDIT:
habs so, im __init__ probiert:

Code: Alles auswählen

self.Bind(wx.EVT_CLOSE, self.Destroy)
Alllerdings schmeißt er da ne Fehlermeldung, zu viele Argumente.

EDIT:
habs dann so hin bekommen:

Code: Alles auswählen

self.Bind(wx.EVT_CLOSE, self.button_beenden_clicked)
Zuletzt geändert von The Hit-Man am Donnerstag 20. Januar 2011, 15:58, insgesamt 1-mal geändert.
BlackJack

@The Hit-Man: Aus welcher Schleife kommst Du nicht heraus? Reagierst Du auf EVT_CLOSE von dem Dialog irgendwie?

Edit: Naja, `Destroy()` erwartet halt nicht, dass dort ein Argument übergeben wird und kann dementsprechen auch nichts mit dem Event-Objekt anfangen.
Antworten