在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布中的所有对象