Seite 1 von 1

Wie bekomm ich die wxMDIChildFrame anzahl herraus ?

Verfasst: Sonntag 29. Februar 2004, 01:32
von Sneaker
Hab das problem das ich bei meiner MDI application wissen muss wieviele wxMDIChildframes offen sind und habe bis jetzt noch keine methode gefunden, würde auch schon reichen wenn ich wüsste ob überhaupt noch ein childframe existiert
mit hochzählen finde ich ein bisschen unschön da muss es doch was besseres geben oder ?

Verfasst: Sonntag 29. Februar 2004, 12:54
von Dookie
Hi Sneaker,

ich kenn mich mit wx leider ned soo aus. Aber wenn keine spezielle Methode für die Anzahl der Childframes existiert, und die geöffneten Childframes nicht in einer Liste oder was ähnlichem eingetragen sind, wirst Du ums hochzählen nicht rumkommen.
Wenns nur darum geht, ob überhaupt noch ein Childframe existiert, ist das hochzählen ja beim ersten schon wieder beendet.


Gruß

Dookie

Verfasst: Sonntag 29. Februar 2004, 14:29
von Sneaker
Hmmm ok dann werde ich das mal machen
hab noch ne frage wie ist das EVT wenn man ein fenster focusiert ? EVT_FOCUS ???

Verfasst: Sonntag 29. Februar 2004, 15:37
von Dookie
Da gibts wohl EVT_SET_FOCUS und EVT_KILL_FOCUS
siehe auch:
http://www.wxwindows.org/manuals/2.4.2/ ... ngoverview


Gruß

Dookie

Verfasst: Sonntag 29. Februar 2004, 15:57
von Sneaker
Ah thx die sind mir mal wieder entfallen, aber genau die hab ich gesucht :)

Verfasst: Montag 1. März 2004, 04:23
von Christopy
Evt. ginge auch folgendes:

Code: Alles auswählen

for i in self.GetChildren():
    if isinstance(i, wxMDIChildFrame):
        z = z + 1
wobei self der wxMDIParentFrame ist und z der Anzahl der geöffneten Fenster entspricht. Die isinstance-Abfrage muss sein, da GetChildren() auch solche Sachen wie StatusBar usw. von wxMDIParentFrame mitliefert.
Vermutlich kann man das Ganze auch noch ein wenig geschickter in einer einzigen Zeile verpacken...

Verfasst: Montag 1. März 2004, 16:15
von Dookie
jo kann man 8)

Code: Alles auswählen

myChildFrames = [x for x in self.GetChildren() if isinstance(x, wxMDIChildFrame)]
myChildFrames enthält dann eine Liste der ChildFrames. Die Anzahl kann mit len(myChildFrames) bestimmt werden und mit einem einfachen
if myChildFrames: kann abgefragt werden ob überhaupt ChildFrames existieren.


Gruß

Dookie

Verfasst: Montag 1. März 2004, 17:49
von Christopy
Ahh. Danke Dookie!
Hab das irgendwie nicht hinbekommen... 8)

Verfasst: Montag 1. März 2004, 18:18
von Sneaker
Habs jetzt anders gemacht ich speicher jetzt jeden wxMDIChildFrame in einer liste ab da ich beim beenden des programms noch aktionen im Child ausführen muss

edit:
Naja habs jetzt doch so gemacht wie ihr ;) dann spar ich mir die verwaltung mit der liste und die rechenzeit die dabei drauf geht kann man wohl vernachlässigen da die sowieso nur beim schliessen eines fensters anfällt

mal ne ganz andere frage ich bräuche für meine MDI Anwendung noch ein paar icons für meine toolbar kennt ihr eine seite wo man die bekommt ? oder wie ich die von windows benutzen kann ?

Verfasst: Montag 1. März 2004, 19:07
von Dookie
am einfachsten mit google nach "toobar icons" suchen oder selber mit einem Iconeditor basteln. Oder mit dem explorer die Verzeichnisse durchstöbern.


Gruß

Dookie

Verfasst: Montag 1. März 2004, 19:15
von Sneaker
naja ok wenn du auch keine seite kennst

so nun mal wieder ein problem
hab das mit eurem herraus finden wieviele wxMDIchilds noch existieren, bloss wenn ich das genau nach der zerstörung über .Destroy() eines childs aufrufe, existiert immer noch eine zu viel... hab jetzt überlegt den garbage collector einmal durchlaufen zu lassen, oder gibs da noch ne andere lösung ?

Verfasst: Montag 1. März 2004, 22:09
von Christopy
Ich befürchte da gibts überhaupt keine Lösung für :?
Bevor das Fenster zerstört wird, werden erst alle Nachrichten abgearbeitet. Erst in der Freizeit (Idle) wird dann die Zerstörung ausgeführt. Leider hab ich noch keine Lösung gefunden, wie man das abwarten kann, oder wie man einfach sicherstellen kann, dass das Programm erst nach der Zerstörung fortfährt.
Jemand eine Idee?

Verfasst: Montag 1. März 2004, 22:55
von Dookie
hmm bei Tkinter gibts dafür ein "update_idletasks" oder so.
versuchs mal mit einem wxUsleep(10)

Gruß

Dookie

Verfasst: Montag 1. März 2004, 23:07
von Dookie

Verfasst: Montag 1. März 2004, 23:58
von Christopy
Dookie hat geschrieben:hmm bei Tkinter gibts dafür ein "update_idletasks"
Das war ein guter Hinweis! Nach einigen Versuchen hab ich folgende Lösung gefunden:

Code: Alles auswählen

myChildFrames[-1].Destroy()
wxGetApp().ProcessEvent( wxIdleEvent() )
wxUsleep(10) hat leider nicht funktioniert. Vermutlich legt sich dabei der komplette Thread schlafen...

wxupdateuievent ist glaube ich zur Menüänderung. Hab ich in wxWidgets noch nie benutzt. Aber kann mich dunkel dran erinnern mich mal mit der MFC mit sowas ähnlichem rumgeärgert zu haben :wink:

Verfasst: Dienstag 2. März 2004, 06:50
von Sneaker
und schon wieder danke an euch :)

Verfasst: Mittwoch 3. März 2004, 18:50
von Sneaker
So mal wieder ne frage zu wxPython und ich schreib mal meine probleme weiter hier rein dann muss ich nicht gleich 1000 neue threads erstellen...

und zwar hab ich jezt ne Toolbar mit Buttons... die Buttons erstell ich über die Methode AddSimpleTool() das problem ist das der button der dabei entsteht 3D ist und das sieht einfach dumm aus. Nun such ich eine funktion die das abstellt, hatte schon wxBitmapButtons eingefügt bloss der aufwand verdreifacht sich dadurch... jemand ne idee oder doch der umweg über wxBitmapButtons ?

edit:
hat sich schon wieder erledigt, das hängt vom betriebsystem ab ob das ding 3d oder 2d dargestellt wird