在Tkinter帆布移动球
这是一个非常基本的程序,我想要做两个移动的球,但其中只有一个实际上移动。
我也尝试了一些变化,但不能得到第二个球移动; 另一个相关的问题 – 有些人使用move(object)
方法来实现这一点,而其他人做一个delete(object)
,然后重绘它。 我应该使用哪一个,为什么?
这是我的代码,只是animation/移动一个球:
from Tkinter import * class Ball: def __init__(self, canvas, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 self.canvas = canvas self.ball = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill="red") def move_ball(self): while True: self.canvas.move(self.ball, 2, 1) self.canvas.after(20) self.canvas.update() # initialize root Window and canvas root = Tk() root.title("Balls") root.resizable(False,False) canvas = Canvas(root, width = 300, height = 300) canvas.pack() # create two ball objects and animate them ball1 = Ball(canvas, 10, 10, 30, 30) ball2 = Ball(canvas, 60, 60, 80, 80) ball1.move_ball() ball2.move_ball() root.mainloop()
您不应该在GUI程序中放置一个无限循环 – 已经有一个无限循环运行。 如果你想让球独立移动,只需取出循环,并让move_ball
方法在事件循环中给自己添加一个新的调用。 这样,你的球会永远继续运动(这意味着你应该在那里进行一些检查,以防止发生)
我已经通过删除无限循环稍微修改了你的程序,稍微减慢了animation,并且还使用随机值来确定它们移动的方向。 所有这些变化都在move_ball
方法中。
from Tkinter import * from random import randint class Ball: def __init__(self, canvas, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 self.canvas = canvas self.ball = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill="red") def move_ball(self): deltax = randint(0,5) deltay = randint(0,5) self.canvas.move(self.ball, deltax, deltay) self.canvas.after(50, self.move_ball) # initialize root Window and canvas root = Tk() root.title("Balls") root.resizable(False,False) canvas = Canvas(root, width = 300, height = 300) canvas.pack() # create two ball objects and animate them ball1 = Ball(canvas, 10, 10, 30, 30) ball2 = Ball(canvas, 60, 60, 80, 80) ball1.move_ball() ball2.move_ball() root.mainloop()
这个function似乎是罪魁祸首
def move_ball(self): while True: self.canvas.move(self.ball, 2, 1) self.canvas.after(20) self.canvas.update()
当你打电话时,你故意让自己陷入无限循环。
ball1.move_ball() # gets called, enters infinite loop ball2.move_ball() # never gets called, because code is stuck one line above
它只能移动一个,因为程序一次只能读取一个variables。 如果你把程序设置为当球到达某一点时读取,比如说canvas的结束,你可以编写程序来读取下一行,并触发第二个球移动。 但是,这只会一次移动一个。
你的程序是从字面上卡住的:
ball1.move_ball()
它永远不会排队:
ball2.move_ball()
因为循环结束的地方没有限制。
否则,“sundar nataraj”的答案将做到这一点。
尝试而不是self.canvas.move(self.ball, 2, 1)
使用
self.canvas.move(ALL, 2, 1)
所有这些用于移animation布中的所有对象