Problem mit bind event
Verfasst: Montag 31. August 2015, 23:38
Hatte mich schon gewundert, warum mein Programm mitunter abschmiert, wenn ich commands und events nicht über meine Queue zur Ausführung bringe. Habe jetzt herausgefunden, woran es liegt.
Hier ist eine kleine Callback Funktion und die ist abgeschmiert:Erste Zeile egal, kam da eh nicht zur Anwendung. Zweite Zeile ein durch try und except abgesichertes config. Und die nachfolgende Zeile funktionierte in einem speziellen Fall nicht mehr:Da fragt man sich schon, wie kann das sein. Hier handelt es sich um ein Entry Eingabefeld. Meine Widgets haben eine Membervariable mydata für extra Daten. Hier hatte ich abgelegt für welche config Option das sein sollte. Eine spezielle config Option meiner Widgets, die es normalerweise nicht gibt, heißt 'link'. Wenn man die setzt, wird ein Sccript nachgeladen oder sukzessive auch viele. Beim Nachladen dieser Scripts wurde richtigerweise das Entry Eingabefeld gelöscht. Die Callbackfunktion aber hat doch im ersten Parameter 'me' eine Referenz auf das Widget. Also hätte es doch noch existieren müssen.
Aber der bind Befehl kümmert sich nicht darum, hat das Widget beseitigt trotz der Referenz 'me' im ersten Parameter. Dadurch crashte me['bg']='gray'. Wenn ich allerdings den bind Befehl nicht den Callback Aufruf ausführen lasse, sondern den Callback zur Ausführung an eine Queue übergeben lasse, dann bleibt bei der Ausführung die Referenz auf das Widget erhalten und es wird deshalb auch nicht während des Callbacks gelöscht, sondern erst nachher.
Daher habe ich keine Probleme, wenn ich dann die Callbacks über eine Queue ausführen lasse. Mit dem bind Befehl dagegen komme ich in speziellen Situationen nicht besonders weit.
Also, wenn man 'bind' nimmt, ist es keine gute Idee, das Widget während des Callbacks zu beseitigen und dann noch auf es zugreifen wollen.
Die andere Frage wäre, macht das Programm dann diese Timer Message noch oder nicht mehr: informLater(300,me,'color',True)
Da hab ich keine Ahnung. Sichtbar ist es eh nicht mehr, und ob es dann noch existiert, entzieht sich meiner Kenntnis. Aber crashen tut es nicht, denn infom und informLater sind abgesichert gegen Nichtexistenz.
Also ohne zusätzliche Referenz wird das Widget beseitigt, ohne Rücksicht darauf, dass man gerade den Callback ausführt. Callback ausführen zählt also nicht als Referenz!
Hier ist eine kleine Callback Funktion und die ist abgeschmiert:
Code: Alles auswählen
def entry_event(me,button=None):
if button != None: button.setconfig('bg',me.get())
setconfig(me.mydata,me.get())
me['bg']='gray'
informLater(300,me,'color',True)
Code: Alles auswählen
me['bg']='gray'
Aber der bind Befehl kümmert sich nicht darum, hat das Widget beseitigt trotz der Referenz 'me' im ersten Parameter. Dadurch crashte me['bg']='gray'. Wenn ich allerdings den bind Befehl nicht den Callback Aufruf ausführen lasse, sondern den Callback zur Ausführung an eine Queue übergeben lasse, dann bleibt bei der Ausführung die Referenz auf das Widget erhalten und es wird deshalb auch nicht während des Callbacks gelöscht, sondern erst nachher.
Daher habe ich keine Probleme, wenn ich dann die Callbacks über eine Queue ausführen lasse. Mit dem bind Befehl dagegen komme ich in speziellen Situationen nicht besonders weit.
Also, wenn man 'bind' nimmt, ist es keine gute Idee, das Widget während des Callbacks zu beseitigen und dann noch auf es zugreifen wollen.
Die andere Frage wäre, macht das Programm dann diese Timer Message noch oder nicht mehr: informLater(300,me,'color',True)
Da hab ich keine Ahnung. Sichtbar ist es eh nicht mehr, und ob es dann noch existiert, entzieht sich meiner Kenntnis. Aber crashen tut es nicht, denn infom und informLater sind abgesichert gegen Nichtexistenz.
Also ohne zusätzliche Referenz wird das Widget beseitigt, ohne Rücksicht darauf, dass man gerade den Callback ausführt. Callback ausführen zählt also nicht als Referenz!