[python-users] Tkinterprobleme

Michael Riedel mriedel at inova-semiconductors.de
Do Apr 19 14:53:20 CEST 2007


Hallo,

 > 1) Warun ist das so?

Solange 'mainloop' nicht betreten wurde, wird kein "Tk-Code" ausgeführt 
- also auch keine Grafik angezeigt/aktualisiert, wenn aber 'mainloop' 
betreten wurde, dann herrscht Tk (mainloop ist - der Name sagt es - ein 
"Loop-Until-Quit") und der Code davor und danach spielt keine Rolle.

 > 2) Wie lann ich das ändern, damit ich die Grafik kontrolliert
 > langsamer ablaufen lassen kann?

Zwei Möglichkeiten: Threads (1 Thread für die Grafikideen, 1 Thread für 
die Tk-Engine), was aber meist berechtigterweise nicht empfohlen wird 
und tatsächlich nicht notwendig ist, weil es besser ist, die callbacks 
zu verwenden, die Tk bietet:

(A) Tk Timer callback

To trigger a callback after a specified delay, e.g. for animation, use 
'after':

   someWidget.after(delay_ms, callback, arg1, arg2...)

     * arg1, arg2... represent zero or more optional extra arguments
     * The callback receives only those optional extra arguments, if
       specified
     * The callback is only called once for each call to after
       (also muss man in der callback Funktion wieder ein 'after'
        verwenden, um erneut und periodisch aufgerufen zu werden)

(B) Tk idle callback

z.B.

http://www.pythonware.com/library/tkinter/introduction/x9507-alarm-handlers-and-other.htm

Es gibt bestimmt noch "bessere" Links, aber der fiel mir gerade auf und 
mehr Zeit habe ich jetzt leider nicht zum gezielten Suchen...

Grüße und viel Erfolg.

Michael

prof. dr. peter ziese wrote:
> Hallo,
> 
> ich hoffe, ich stelle keine allzu dumme Frage, naja und wenn schon...
> Ich wollte die Funktion sleep() bei der Grafiklprogrammierung benutzen, so wie 
> es zB. in folgendem snippetim Textbereich  erfolgt:
> 
> from time import *
> 
> for i in range(5)
> 	print ctime().split()[3]
> 	sleep(1)
> 
> Ich habe ein kleines Beispiel dafür:
> 
> # strahlenkranz
> from Tkinter import *
> from math import *
> from time import *
> 
> fenster=Tk()
> fenster.title('strahlenkranz')
> breite=600
> hoehe=300
> 
> c=Canvas(fenster,width=breite,height=hoehe)
> c.pack()
> for z in range(1,180):
> strahl=c.create_line(breite/2,hoehe/2,breite/2+180*cos(z),hoehe/2+60*sin(z),fill='red')
>     sleep(0.01)
> fenster.mainloop()
> 
> Die Einrückung ist im Browser nicht korrekt, bei mir schon. Das Ergebnis ist 
> jedoch nicht wie gewünscht. Das Programm wartet zu Beginn die 'sleep-zeit' 
> ab, und läuft dann ungebremst ab. Egal, wo ich sleep() einfüge, das Ergebnis 
> ist das gleiche. Ich habe daraufhin eine eigene Funktion 'pause()' 
> geschrieben, die die Differenz ziwschen Startzeit und aktueller Zeit 
> überprüft, und wenn dieser Wert mit dem Übergabewert übereinstimmt, 
> zurückkehrt. Das Ergebnis ist das gleiche. Ich habe dann in die Steinmzeit 
> des Programmierens zurückgegriffen und eine Zählschleife bemüht. Das Ergebnis 
> immer das gleiche: Statt die Ausführuing der Grafik zu verlangsamen, erfolgt 
> zu Beginn eine Pause. Ich habe 2 Fragen:
> 
> 1) Warun ist das so?
> 2) Wie lann ich das ändern, damit ich die Grafik kontrolliert langsamer 
> ablaufen lassen kann? 
> 
> MfG
> 
> Peter
> 
> ________________________________________
> Diese Mail erhalten Sie ueber die Mailingliste Python-users der Universitaet zu Koeln
> Python-users at uni-koeln.de
> https://lists.uni-koeln.de/mailman/listinfo/python-users
> 
> !DSPAM:4627556d93411804284693!
-- 





Mehr Informationen über die Mailingliste python-users