mvi*_*mes 3 python animation tkinter python-2.7
为什么动画不起作用?运行程序时,形状不会移动.
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()
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 19
你的animation方法有一个while True循环,永远不会破坏.这是GUI程序中的禁忌,因为从不返回,它会阻止GUI的事件循环处理事件.因此,例如,如果您有菜单,则用户将无法选择任何菜单项.除了您在animation方法中实现的任何操作外,GUI将显示为冻结状态.
这是@Tim's代码的略微修改,通过删除while循环并在返回之前简单地移动外星人一步来修复此问题.self.master.after在animation方法结束时调用,以便在短暂停顿后再次调用事件循环动画.
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()
Run Code Online (Sandbox Code Playgroud)
你从来没有打过这个animation方法.还有一些其他命名问题.
# 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()
Run Code Online (Sandbox Code Playgroud)