Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Tkinter Animation

Why is the animation not working? The shape doesn't move when I run the program.

from Tkinter import *
import time



class alien(object):
     def __init__(self):
        self.root = Tk()
        self.canvas = Canvas(self.root, width=400, height = 400)
        self.canvas.pack()
        alien1 = self.canvas.create_oval(20, 260, 120, 360, outline='white',         fill='blue')
        alien2 = self.canvas.create_oval(2, 2, 40, 40, outline='white', fill='red')
        self.canvas.pack()
        self.root.mainloop()

     def animation(self):
        track = 0
        while True:
        x = 5
        y = 0
        if track == 0:
           for i in range(0,51):
                self.time.sleep(0.025)
                self.canvas.move(alien1, x, y)
                self.canvas.move(alien2, x, y)
                self.canvas.update()
           track = 1
           print "check"

        else:
           for i in range(0,51):
                self.time.sleep(0.025)
                self.canvas.move(alien1, -x, y)
                self.canvas.move(alien2, -x, y)
                self.canvas.update()
           track = 0
        print track

alien()
like image 650
mvitagames Avatar asked Nov 04 '12 01:11

mvitagames


1 Answers

Your animation method has a while True loop in it which never breaks. This is a no-no in a GUI program, because by never returning, it prevents the GUI's event-loop from processing events. So, for example, if you had a Menu, then the user would not be able to select any menu item. The GUI would appear frozen, except for whatever actions you implement in the animation method.

Here is a slight modification of @Tim's code which fixes this problem by removing the while loop and simply moving the aliens one step before returning. self.master.after is called at the end of the animation method to have the event loop call animation again after a short pause.


import tkinter as tk
import time

class Alien(object):
    def __init__(self, canvas, *args, **kwargs):
        self.canvas = canvas
        self.id = canvas.create_oval(*args, **kwargs)
        self.vx = 5
        self.vy = 0

    def move(self):
        x1, y1, x2, y2 = self.canvas.bbox(self.id)
        if x2 > 400:
            self.vx = -5
        if x1 < 0:
            self.vx = 5
        self.canvas.move(self.id, self.vx, self.vy)

class App(object):
    def __init__(self, master, **kwargs):
        self.master = master
        self.canvas = tk.Canvas(self.master, width=400, height=400)
        self.canvas.pack()
        self.aliens = [
            Alien(self.canvas, 20, 260, 120, 360,
                  outline='white', fill='blue'),
            Alien(self.canvas, 2, 2, 40, 40, outline='white', fill='red'),
        ]
        self.canvas.pack()
        self.master.after(0, self.animation)

    def animation(self):
        for alien in self.aliens:
            alien.move()
        self.master.after(12, self.animation)

root = tk.Tk()
app = App(root)
root.mainloop()
like image 189
unutbu Avatar answered Oct 26 '22 23:10

unutbu