Refresh und Focus

Plattformunabhängige GUIs mit wxWidgets.
Antworten
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Hallo alle zusammen,

ich bastle gerade an einem Memory-Spiel. Die Karten sind Bilder, die ich auf vielen kleinen Panels abbilde. Diese Panels liegen ihrerseits wieder auf einem Panel, das sich im Hauptrahmen befindet (ich verwende keine Sizer, weil ich noch nicht ganz kapiert habe, wie ich die benutze und was ich damit tu, aber das will ich hier und jetzt auch gar nicht lernen ;) ).

So, zum Problem:

Wenn das Spiel ganz oder teilweise durch ein anderes Fenster verdeckt worden ist, sind die bisher aufgedeckten Karten nicht mehr zu sehen. Ein Refresh wird notwendig. Nur, wann?

Ich hatte gedacht, daß das Hauptfenster mitbekommt, wenn es von einem anderen verdeckt wird oder zumindest mitbekommt, wenn es wieder den Focus bekommt. Aber das scheint nicht so einfach zu sein.

Fragen:
- Ist das Warten auf den Focus die richtige Methode?
- Wenn ja, müssen alle Panels für sich prüfen, ob sie den Focus haben und das dann an das Hauptfenster weiterleiten?
- Gibt es ein System Refresh-Event, wenn ja, wie wird es genutzt?

Danke für Eure Hilfe,

Christoph
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

ChrisGTJ hat geschrieben:Wenn das Spiel ganz oder teilweise durch ein anderes Fenster verdeckt worden ist, sind die bisher aufgedeckten Karten nicht mehr zu sehen.
Hallo Christoph!

Das funktioniert normalerweise automatisch, wenn du das Paint-Ereignis zum Zeichnen verwendest. Ich vermute einen Fehler in deinem Code. Wenn du noch nicht so weit bist, dann nimm lieber ``wx.StaticBitmap``. Das kümmert sich selbst darum, dass die Bilder immer sichtbar sind.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Hallo Gerold,

danke für die Antwort. Ich habe mal nach dem StaticBitmap gesucht und bin auf den folgenden Therad gestoßen:

http://www.python-forum.de/topic-8794.h ... aticbitmap

Ich habe Dein Beispiel abgekupfert und sehr vereinfacht (weil ich eh noch ein Bildchen vergrößert darstellen wollte) und habe dann das Paint Event gebunden:

self.mainPanel.Bind(wx.EVT_PAINT, self.onPaint)

Das macht dem armen Rechner aber mächtig Streß, richtig? Vollauslastung, weil das Event dauernd ankommt. In dem abgespeckten Beispiel von Dir ist das natürlich nicht so, da beibt der Rechner unbeeindruckt.

Ich habe es dann so geändert, daß ich für jede Karte, sobald sie aufgedeckt ist, das Paint-Event an ihr Panel binde. Die Bindung wird gelöst, wenn die Karte wieder verdeckt oder gelöscht wird. Trotzdem wird es scheinbar anstrengend für den Rechner (klar, je mehr Karten aufgedeckt sind...). Kann man da was tun?

Gruß und Danke,

Christoph
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

ChrisGTJ hat geschrieben:Ich habe Dein Beispiel abgekupfert und sehr vereinfacht (weil ich eh noch ein Bildchen vergrößert darstellen wollte) und habe dann das Paint Event gebunden
Hallo Christoph!

Wenn du wx.StaticBitmap verwendest, dann brauchst du das Paint-Ereignis nicht mehr. Du übergibtst beim Erstellen des wx.StaticBitmap den Pfad zur Bilddatei und schon hast du ein Bild, das du irgendwohin legen kannst. Um das Neuzeichnen kümmert sich wxPython selbst.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Hallo Gerold,

danke noch mal für den Hinweis, ich werde es bei Gelegenheit ausprobieren (hoffentlich, man weiß ja, wie lange Provisorien halten ;)) .

Gruß und schönes Maifeiern!

Christoph
Antworten