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!