"_core.PyAssertionError" beim Schreiben in ein Ric

Plattformunabhängige GUIs mit wxWidgets.
Antworten
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

ich benutze die python irclib zusammen mit wxPython um einen IRC-Client zu programmieren. Dafür habe ich dann dieses Event benutzt, um alle einkommenden Nachrichten in ein RichTextCtrl zu schreiben:

Code: Alles auswählen

    def on_all_raw_messages(self, connection, event):
        ## rohes IRC-Zeugs, schreibe in Server-Window ##
        self.window.writeRaw(event.arguments()[0])
Die writeRaw sieht so aus:

Code: Alles auswählen

    def writeRaw(self, what):
        ## schreibe 'what' roh in Fenster
        self.txtirclog.WriteText(what)
        self.txtirclog.Newline()
Nun gibt es aber manchmal (nicht immer) eine Fehlermeldung wie diese:

Code: Alles auswählen

 File "C:\Programmieren\Python25\Projects\irc\1\circeIRCClient.py", line 128, in on_all_raw_messages
self.window.writeRaw(event.arguments()[0])
 File "C:\Programmieren\Python25\Projects\irc\1\circeIRCChild.py", line 55, in writeRaw
self.txtirclog.WriteText(what)
 File "(...)\richtext.py", line 752, in WriteText
return _richtext.RichTextCtrl_WriteText(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "wxWindow::FindFocus() == GetWindow()" failed at ..\..\src\msw\caret.cpp(162) in wxCaret::DoMove(): how did we lose focus?
Wie kann ich das verhindern?

Danke schonmal,

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

fred.reichbier hat geschrieben:Die writeRaw sieht so aus:

Code: Alles auswählen

    def writeRaw(self, what):
        ## schreibe 'what' roh in Fenster
        self.txtirclog.WriteText(what)
        self.txtirclog.Newline()
Hi Fred!

Versuchs mal so (ohne Gewähr und Pistole):

Code: Alles auswählen

    def writeRaw(self, what):
        ## schreibe 'what' roh in Fenster
        wx.CallAfter(self.txtirclog.WriteText, what)
        wx.CallAfter(self.txtirclog.Newline, (,))
Vielleicht hilft es...

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hi,

danke, das hat aber auch nichts gebracht. Habs dann mal ganz simpel so gemacht:

Code: Alles auswählen

    def writeRaw(self, what):
        ## schreibe 'what' roh in Fenster
        try:
            self.txtirclog.WriteText(what)
            self.txtirclog.Newline()
        except:
            pass
Funktioniert so, also lasse ich das halt mal so ;)

Falls noch irgendwas passiert, melde ich mich.

Danke nochmal,

fred
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi, mache es lieber so und fang die Ausgelöst exception ab :)

Code: Alles auswählen

wx._core.PyAssertionError: C++ assertion "wxWindow::FindFocus() == GetWindow()" failed at ..\..\src\msw\caret.cpp(162) in wxCaret::DoMove(): how did we lose focus?

Code: Alles auswählen

try:
   ....
except wx._core.PyAssertionError:
    pass
Fang lieber immer die Exception ab die ausgelöst wird, und behandele sie dann. Wenn du nur ``except:`` schreibst, werden alle Exceptions von jedem Exception-Typ abgefangen, was zu unvorhergesehen Sachen führe kann (Und das große suchen nach der Fehlerquelle geht da los :/).

lg
Antworten