Seite 1 von 1

verstehe Fehlermeldung einer einfachen Simulation nicht

Verfasst: Donnerstag 29. Januar 2009, 16:56
von smashed to pieces
Hallo,
wollte gerade angefangen eine Simulation von einem idealen Gas zu schreiben. Leider frustrierend, schon jetzt durch eine Fehlermeldung gestoppt zu werden, welche beim schließe des Fensters erscheint. Sie stört zwar den Programmablauf in keiner Weise, allerdings mach ich doch irgendwas falsch :(.
Bin natürlich auch über jegliche Verbesserungsvorschläge glücklich.

Code: http://paste.pocoo.org/show/101870/

Fehlermeldung:

Code: Alles auswählen

Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\Python25\lib\threading.py", line 486, in __bootstrap_inner
    self.run()
  File "C:\Dokumente und Einstellungen\Max\workspace\simulation\src\new2.py", line 42, in run
    if self.centerPosition[0]+self.radius > int(self.environment['width']) or self.centerPosition[0]-self.radius < 0:
  File "C:\Python25\lib\lib-tk\Tkinter.py", line 1201, in cget
    return self.tk.call(self._w, 'cget', '-' + key)
TclError: invalid command name ".12137936"
Es erscheint diese Fehlermeldung 6 mal hintereinander, also für jede Kugel einmal (Thread 1-6).
".12137936" ist die Nummer, die ich über

Code: Alles auswählen

print 
self.canvas
erhalte. Sollte ich also diese Threads zuerst beenden bevor ich versuche das Fenster zu zerstöhrung? Leider weiß ich gerade nicht wie ich einen Thread beenden kann, bzw. wie ich eine Kugel zerstöhren kann. Das heißt es funktioniert nicht so wie ich es mir dachte.

Weiter stört mich das ich mit:

Code: Alles auswählen

self.root.overrideredirect(1)  
nicht nur den 'Rand' des Fensters verschwinden lasse, sondern weiters es im Task-Manager unter Anwendungen nicht mehr angezeigt wird.

Ich verwende unter Window Eclipse.
mfg
smashed

Verfasst: Donnerstag 29. Januar 2009, 17:43
von numerix
Das Problem ist schon häufiger im Forum behandelt worden: Meist ist es keine gute Idee, Threads (die auf die GUI zugreifen) mit einer GUI zu kombinieren. Immerhin läuft dein Programm, obwohl es gegen diese Grundregel verstößt.

Für so etwas gibt es in Tkinter die after()-Methode. Sieh dir dochmal die Doku dazu an. Dann kommst du ohne Threads aus.

Verfasst: Donnerstag 29. Januar 2009, 23:14
von smashed to pieces
Hallo numerix,
danke für die Antwort. Die after()-Methode kenne ich bereits, doch bei dieser ergibt sich ein größeres Problem: Die Kugeln werden manchmal schnell bzw. langsamer. (Unregelmäßig und sprunghaft sind diese Änderungen der Geschwindigkeit (öffters die Sekunde)).Das heißt canvas.after hält die Wartezeit aus irgendeinem Grund nicht ein. :(

Wahrscheinlich verwende ich es dennoch falsch:
Code: http://paste.pocoo.org/show/101943/ (Zeile 42)

Die CPU-Auslastung schwangt, je nach Geschwindigkeit der Kugeln zwischen 12 und 98 Prozent.
Die Fehlermeldung am Schluss tritt allerdingts nicht mehr aus. So weit so gut :).

mfg
smashed


edit: http://www.youtube.com/watch?v=DxUb791LG6E :D

Verfasst: Donnerstag 29. Januar 2009, 23:45
von numerix
smashed to pieces hat geschrieben:Wahrscheinlich verwende ich es dennoch falsch:
Code: http://paste.pocoo.org/show/101943/ (Zeile 42)
Nein, die Verwendung ist korrekt. Auf meinem Linuxsystem kann ich das von dir beschriebene (und gezeigte) Verhalten nicht reproduzieren. Da läuft es einwandfrei flüssig. Evtl. hilft ja ein

Code: Alles auswählen

self.environment.update()
direkt vor dem Aufruf von after()?

Verfasst: Freitag 30. Januar 2009, 16:10
von smashed to pieces
Vielen Danke. Funktioniert jetzt einwandfrei. :)

Hab allerdings noch eine ganz andere Frage. Ich würde ein Programm gern an events binden können, die geschehen während das Fenster den Fokus nicht hat.
Das zum Beispiel Tk-Fenster welche mit withdraw versteckt wurden, auf gewissen Tastenkombination reagieren können.

Verfasst: Freitag 30. Januar 2009, 16:25
von numerix
smashed to pieces hat geschrieben:Vielen Danke. Funktioniert jetzt einwandfrei. :)

Hab allerdings noch eine ganz andere Frage. Ich würde ein Programm gern an events binden können, die geschehen während das Fenster den Fokus nicht hat.
Das zum Beispiel Tk-Fenster welche mit withdraw versteckt wurden, auf gewissen Tastenkombination reagieren können.
Ich denke mal nicht, dass das geht.
Du könntest ja mal beschreiben, welche Funktionalität du dir vorstellst. Vielleicht gibt es einen anderen Weg, das zu erreichen.

Verfasst: Freitag 30. Januar 2009, 16:58
von smashed to pieces
Hm. Schade.
Bin auf die Idee gekommen, da ich ein Programm suche, welches durch gleichzeitiges Drücken der Strg-Taste sowie der Linken-Maustaste die Rechte simuliert. Die ursprünglich gedrückten Tasten sollten abgefangen werden.
Das Programm suche ich um eine MacMaus (besitzt nur eine Taste ^^) für Windows verwendbar zu machen.

Ich weiß allerdings das Python für diesen Zweck sicherlich nicht der richtige Weg ist. Hatte jetzt eher an ein Python-Programm gedacht, das Tastatureingaben mitschreiben kann ohne direkt sichtbar zu sein.

Dachte es gäbe vielleicht eine passende Abfrage an das Betriebssystem.