这是一个非常基本的程序,我想制作两个移动球,但实际上只有一个移动。
我也尝试了一些变化但是不能让第二个球移动;另一个相关的问题 - 有些人使用move(object)
方法来实现这一目标,而其他人则使用delete(object)
然后重绘它。我应该使用哪一个?为什么?
这是我的代码,它只是动画/移动一个球:
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()
答案 0 :(得分:12)
你永远不应该在GUI程序中放置一个无限循环 - 已经有一个无限循环运行。如果你想让你的球独立移动,只需取出循环并让move_ball
方法在事件循环上对它自己进行新的调用。这样,你的球将继续永远移动(这意味着你应该在那里进行某种检查以防止这种情况发生)
我通过删除无限循环,稍微调整动画的速度,以及使用移动方向的随机值,略微修改了程序。所有这些更改都在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()
答案 1 :(得分:2)
这个功能似乎是罪魁祸首
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
答案 2 :(得分:2)
它唯一的移动因为程序一次只读取一个变量。如果你设置程序在球到达某个位置时读取,比如画布的结尾,你可以编写程序来读取下一行并触发第二个球移动。但是,这只能一次移动一个。
你的程序确实存在问题:
ball1.move_ball()
它永远不会排队:
ball2.move_ball()
因为循环应该结束的位置没有限制。
否则,“sundar nataraj”的回答就是这样。
答案 3 :(得分:0)
试
而不是self.canvas.move(self.ball, 2, 1)
使用
self.canvas.move(ALL, 2, 1)
所有这些都用于移动画布中的所有对象