BlackJack hat geschrieben:Öffentlich ist die Informationen das man den Tcl-Interpreter nur von einem Thread aus benutzen darf. Damit ist alles gesagt was man wissen muss. Wer es doch tut schreibt Code der funktionieren kann, aber nicht muss, und schlicht und einfach falsch ist.
Bitte erkennen, begreifen, verstehen. Damit man den Tcl-Interpreter in dem richtigen Thread verwendet, schreibt man nur etwas in die Queue von ihm und weckt ihn dadurch auf. Und daher habe ich das mit dem Event genau richtig implementiert.
BlackJack hat geschrieben:Edit:Die Ereignisse für Mausklicks werden Tk-intern in diese Queue geschrieben, also innerhalb des Threads in dem die Hauptschleife läuft, womit das sicher ist weil daran nur dieser eine Thread beteiligt ist.
Das ist ebenfalls nicht wahr. Das hieße ja, solange Du Dich nicht in dem Thread der Hauptschleife befindest, kannst Du klicken, was Du willst und es passiert nichts. Also kann man tkinter vergessen, weil Du klicken kannst was Du willst, ohne jeden Effekt. Richtig ist, dass man erst etwas in die Queue schreiben muß, um die mainloop aufzuwecken.
Und was macht event_generate? Genau dasselbe, was ich bei den anderen Threads getan habe:
Code: Alles auswählen
def send(self,msgid,msgdata=None):
self.Queue.put((msgid,msgdata))
self.event.set()
Schreibt etwas in eine threadsichere Queue und setzt das event des Threads, damit der aus dem lock von wait() in der Event loop aufwacht.
Statt send, musst Du Dir eben event_generate vorstellen, wenn Du dazu in der Lage bist.