verstehe Fehlermeldung einer einfachen Simulation nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
smashed to pieces
User
Beiträge: 38
Registriert: Samstag 24. November 2007, 16:50

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
smashed to pieces
User
Beiträge: 38
Registriert: Samstag 24. November 2007, 16:50

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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()?
smashed to pieces
User
Beiträge: 38
Registriert: Samstag 24. November 2007, 16:50

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
smashed to pieces
User
Beiträge: 38
Registriert: Samstag 24. November 2007, 16:50

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.
Antworten