Scratch to Python 2/10/12: Malen mit tkinter - Animationen

Heute haben wir einen Alien gezeichnet mit tkinter und dann mit einer Funktion animiert. Nächstes mal wollen wir dann den Alien im Schaufenster sprechen lassen.

from tkinter import *
from time import sleep

window = Tk()
window.title('Alian')
c = Canvas(window, height=300, width=400)
c.pack()
körper = c.create_oval(100, 150, 300, 250, fill='green')
auge = c.create_oval(170, 70, 230, 130, fill='white')
pupille = c.create_oval(190, 90, 210, 110, fill='black')
mund = c.create_oval(150, 220, 250, 240, fill='red')
hals = c.create_line(200, 150, 200, 130, fill="black")

Und jetzt mit einem Animierten Mund und Pupille.

from tkinter import *

window = Tk()
window.title('Alian')
c = Canvas(window, height=300, width=400)
c.pack()
körper = c.create_oval(100, 150, 300, 250, fill='green')
auge = c.create_oval(170, 70, 230, 130, fill='white')
pupille = c.create_oval(190, 90, 210, 110, fill='black')
mund = c.create_oval(150, 220, 250, 240, fill='red')
hals = c.create_line(200, 150, 200, 130, fill="black")

def mund_auf():
    c.itemconfig(mund, fill = 'black')
def mund_zu():
    c.itemconfig(mund, fill = 'red')

def links():
    c.move(pupille, -10, 0)

def rechts():
    c.move(pupille, 10, 0)

mund_auf()

Ich wollte jetzt eine while True Schleife machen und die Pupille links und rechts immer verschieben, ging aber nicht. Hast du eine Idee warum ? @Dschoni

from tkinter import *
import time

window = Tk()
window.title('Alian')
c = Canvas(window, height=300, width=400)
c.pack()

while True:
    körper = c.create_oval(100, 150, 300, 250, fill='green')
    auge = c.create_oval(170, 70, 230, 130, fill='white')
    pupille = c.create_oval(190, 90, 210, 110, fill='black')
    mund = c.create_oval(150, 220, 250, 240, fill='red')
    hals = c.create_line(200, 150, 200, 130, fill="black")
    c.move(pupille, -10, 0)
    time.sleep(2)
    c.move(pupille, 10, 0)
    time.sleep(2)
    window.update()

@maxl was mach ich da falsch mit der Schleife?

Welche Version von Python benutzt du? Ich habe 3.5.2 auf Ubuntu und da passiert mit dem Code gar nichts.

Loops funktionieren in GUIs anders, so geht es bei mir:

from tkinter import *
import time

def myloop():
    körper = c.create_oval(100, 150, 300, 250, fill='green')
    auge = c.create_oval(170, 70, 230, 130, fill='white')
    pupille = c.create_oval(190, 90, 210, 110, fill='black')
    mund = c.create_oval(150, 220, 250, 240, fill='red')
    hals = c.create_line(200, 150, 200, 130, fill='black')
    c.move(pupille, -10, 0)
    c.update()
    time.sleep(2)
    c.move(pupille, 10, 0)
    c.update()
    time.sleep(2)
    c.after(1000, myloop)

window = Tk()
window.title('Alien')
c = Canvas(window, height=300, width=400)
c.pack()
c.after(0, myloop)
c.mainloop()
1 „Gefällt mir“

ich nutze die neueste 3.7.0

Ah ok das man c.update() machen muss wusste ich nicht. Was macht denn diese Zeile c.after(1000, myloop)

Diese Zeile generiert quasi den Loop, indem sie nach 1000ms die Methode myloop() (also sich selbst) erneut aufruft. Der erste Aufruf findet in der Zeile vor c.mainloop() statt. after(x, y) führt einfach eine Methode y nach x Millisekunden aus. Diese ungewohnte Art des Aufrufs ist nötig, weil GUIs nicht mit linearem Code funktionieren, sondern (fast?) immer ereignisgesteuert sind. D.h. man gibt mit mainloop() das Kommando zurück an die GUI (die sich um alle Events kümmert, z.B. Button-Klicks) und steuert dann die Ausführung von Code nur noch über Events wie in dem Fall mit “after(0, myloop)”.

1 „Gefällt mir“