Python Tkinter Animación

¿Por qué es la animación no funciona? La forma no se mueve cuando yo ejecute el programa.

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()
  • más signos de interrogación por favor
  • estaba tratando de conseguir que el óvalo para mover de izquierda a derecha en el x-eje temático
  • hay algo que necesito para importar ? porque miré el foro en línea y tiene sentido solamente de importación Tkinter y temporizador, no estoy seguro de lo que me estoy perdiendo
InformationsquelleAutor mvitagames | 2012-11-04

3 Kommentare

  1. 6

    Que nunca se llama a la animation método. Hay un par de otras cuestiones de nomenclatura.

    # Assuming Python 2.x
    # For Python 3.x support change print -> print(..) and Tkinter to tkinter
    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()
            self.alien1 = self.canvas.create_oval(20, 260, 120, 360, outline='white',         fill='blue')
            self.alien2 = self.canvas.create_oval(2, 2, 40, 40, outline='white', fill='red')
            self.canvas.pack()
            self.root.after(0, self.animation)
            self.root.mainloop()
    
         def animation(self):
            track = 0
            while True:
                x = 5
                y = 0
                if track == 0:
                   for i in range(0,51):
                        time.sleep(0.025)
                        self.canvas.move(self.alien1, x, y)
                        self.canvas.move(self.alien2, x, y)
                        self.canvas.update()
                   track = 1
                   print "check"
    
                else:
                   for i in range(0,51):
                        time.sleep(0.025)
                        self.canvas.move(self.alien1, -x, y)
                        self.canvas.move(self.alien2, -x, y)
                        self.canvas.update()
                   track = 0
                print track
    
    alien()
    • wow yo no atrapado aquellos error, u puede dar consejos sobre cómo convertirse en un buen programador? cualquier sitio web o libro que pueda ayudarme a mejorar en este hobby porque me parece muy interesante…. y muchas gracias señor!!!
    • Practicar tanto como sea posible y prestar atención a los pequeños detalles. En este caso, todos los nombres temas fueron identificados mediante la lectura de los mensajes de error cuando el programa se ejecuta.
    • Poner duerme en el código es una mala idea. Aunque son cortos, cada vez que el sueño de toda la GUI no reacciona.
  2. 19

    Su animation método tiene un while True bucle en el que nunca se rompe. Este es un no-no en una interfaz gráfica de usuario del programa, porque por no regresar nunca, que impide que la GUI del evento bucle de procesamiento de eventos. Así, por ejemplo, si usted tenía un Menú, a continuación, el usuario no podrá seleccionar cualquier elemento de menú. La interfaz de usuario parece congelado, excepto para las acciones a implementar en el animation método.

    Aquí es una ligera modificación de @Tim código que soluciona este problema mediante la eliminación de la while bucle y simplemente moviendo los extranjeros un paso antes de regresar. self.master.after se llama al final de la animation método para tener el bucle de eventos de la llamada animación de nuevo después de una breve pausa.


    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()
    • o ic, pero ¿cuál es la diferencia entre de Tkinter import * importación y Tkinter como los conocimientos tradicionales??
    • from Tkinter import * de las importaciones de la Tkinter módulo y agrega todos los (público) globales de la Tkinter módulo en el módulo actual del espacio de nombres. import Tkinter as tk de las importaciones de la Tkinter módulo y agrega el módulo objeto en sí mismo — que hace referencia tk — el actual módulo del espacio de nombres. Yo nunca uso from modulename import * porque hace más difícil rastrear donde las variables vienen. Consulte preguntas frecuentes para obtener asesoramiento sobre las «mejores prácticas» para el uso de la importación en un módulo.
    • Bueno, si queremos utilizar una forma más compleja interfaz gráfica de usuario con animaciones, ponemos la animación en la «animación» método y, a continuación, la interfaz gráfica de usuario en sí, con algo así como la gestión de eventos debe estar en o por el llamado _____init_____ de la función, después de que el auto.maestro.después. Estoy en lo correcto ? o debe ser antes ?
    • Me gustaría crear la GUI como normal (y que normalmente se realiza en App.__init__) y al final de App.__init_, llamada self.master.after(0, self.animation). Piénsalo de esta manera: usted obtiene todos los widgets en el lugar y, a continuación, añadir una acción (la llamada de self.animation) para el bucle de eventos.
    • ok ty ! Yo estoy en ello. Siente el poder de python :3
  3. 2

    He aquí una forma de hacerlo usando un bucle:

    from tkinter import * # version 3.x
    
    tk = Tk()
    
    frame = Frame(tk)
    canvas = Canvas(frame) # use canvas
    
    frame.pack(fill = BOTH, expand = 1)
    canvas.pack(fill = BOTH, expand = 1)
    
    ball = canvas.create_oval(10, 10, 30, 30, tags = 'ball') # create object to animate
    
    def animation(x_move, y_move):
        canvas.move(ball, x_move, y_move) # movement
        canvas.update()
        canvas.after(20) # milliseconds in wait time, this is 50 fps
    
        tk.after_idle(animation, x_move, y_move) # loop variables and animation, these are updatable variables
    
    animation(2, 2) # run animation

    Una actualizable variable es una variable que se mantiene la misma cuando se actualiza y se puede actualizar de nuevo.

    • Tengo un montón programa más suave mediante la eliminación de canvas.update() y canvas.after_idle(...) y en lugar de utilizar canvas.after(20, animation, x_move, y_move). También agregar un tk.mainloop() después de la última línea.
    • estoy informado, pero ahora estoy usando Opengl avanzado con shaders e iluminación 3d en c++ y gracias por el aporte! Opengl es mejor que tkinter, aunque…

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea