wx.TaskBarIcon: Wie sauber beenden?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Hallo,

Ich hab hier (zumindest unter WindowsXP) das Phänomen, dass
ich meine Applikation nicht mehr sauber beendet bekomme,
sobald ein TaskBarIcon läuft.

wenn ich mit
self.tb_icon.RemoveIcon()

("self.tb_icon" sei dabei natürlich das TaskBarIcon)

es entferne, ist es zwar in der TaskBar weg... Aber
beim anschließenden Beenden der Applikation verschwindet zwar das
Hauptfenster, aber der Prozess läuft weiter, wie man sehr
schön sehen kann, wenn man die Applikation von der Kommandozeile
aus startet.. da muss ich erst mit "STRG+C" abwürgen.

Nehme ich das TaskBar Icon wieder raus, geht alles.

self.tb_icon.Destroy() hat übrigens einen netten Absturz von
Python zur Folge, mit einer entsprechenden Windows-Fehlermeldung
(der berühmt berüchtigten Fehler-Benachrichtung an Microsoft..)

Wie geht man denn mit den TaskBarIcons "sauber" um?
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

Ich hab hier eine Applikation, ebenfalls mit Taskbaricon, und die macht folgendes:

Code: Alles auswählen

self.NumberWindow.tbicon.RemoveIcon()
self.stop()
self.ExitMainLoop()
sys.exit()
- self ist eine, von wx.App abgeleitete, Klasse
- NumberWindow ist ein Objekt einer, von wx.Frame abgeleiteten, Klasse
- tbicon ist ein wx.TaskBarIcon
- self.stop() stoppt einige zusätzliche Threads
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

oliver1974 hat geschrieben:Ich hab hier (zumindest unter WindowsXP) das Phänomen, dass ich meine Applikation nicht mehr sauber beendet bekomme, sobald ein TaskBarIcon läuft.
Hi oliver!

Bitte ein funktionierendes Beispiel.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Hallo,

Also, mit der Vorgehensweise von Blattlaus klappt es!
Danke. Aber auch das muss man erstmal wissen, dass sind
wieder so Sachen... Ich glaube, ich muss mich mal stark
an dem Wiki beteiligen (von wxPython), da gibts wohl
einiges zu schreiben, solche Sachen stehen nicht in der Doku,
soweit ich weiß..

@Gerold:

Den nicht funktionierenden Code schiebe ich bald noch mal nach,
ich habe den Eindruck, du scheinst eher überrascht zu sein, dass das NICHT ging, oder? Hätte es denn deines Erachtens nach so einfach gehen müssen?
Bei mir war ohne den ExitMainLoop() nix zu wollen.. das bedingt natürlich,
dass man Zugriff auf die Applikationsinstanz hat.. Ist ja kein Problem,
aber wäre natürlich schöner ohne den (wen auch sehr kleinen) Zusatzaufwand...
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Nochmal ergänzend zum letzten Post..

Das Problem mit den "ExitMainLoop" und Co. ist, dass in "wxPython in Action" von Rappin/Dunn explizit diese Methode als "emergency shutdown"" bezeichnet wird, und als "unsauber" gilt.. Nun ja, ich schau mal nach, ob man das noch irgendwie anders hinkriegt.

Die wxPython - Demo scheint es ja auch ohne die Notbremse hinzukriegen, ich werf noch mal einen Blick drauf.
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Das Problem scheint in PySimpleApp() zu liegen... mehr oder minder.

Wenn man eine eigene App-Klasse definiert, und dort in der OnExit()
Methode mittels RemoveIcon() dann das Icon entfernt, klappt das (zumindest unter WindowsXP und Linux) einwandfrei.

(ich wollte das eigentlich als EDIT in den letzten Post reinschreiben, aber irgendwie läuft das Forum bei mir hier unter Linux/Firefox 2.0 überhaupt nicht sauber.. er vergißt laufend meinen Login und lässt mich teilweise nicht die eigenen Posts editieren..)
Antworten