在Tkinter画布中移动球

这是一个非常基本的程序,我想用它来制作两个移动的球,但实际上只有一个移动。


我也尝试了一些变化,但无法使第二个球移动。另一个相关的问题-有些人使用该move(object)方法来实现此目的,而另一些人则使用a 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()


哈士奇WWW
浏览 769回答 3
3回答

慕婉清6462132

您绝对不应在GUI程序中放入无限循环-已经有无限循环在运行。如果您希望球独立运动,只需退出循环并让该move_ball方法在事件循环上对其本身进行新调用。这样,您的球将继续永远移动(这意味着您应该在其中进行某种检查以防止这种情况发生)我已通过删除无限循环,稍微减慢了动画速度以及对它们的移动方向使用了随机值来对您的程序进行了一些修改。所有这些更改都在move_ball方法内部。from Tkinter import *from random import randintclass 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 canvasroot = Tk()root.title("Balls")root.resizable(False,False)canvas = Canvas(root, width = 300, height = 300)canvas.pack()# create two ball objects and animate themball1 = Ball(canvas, 10, 10, 30, 30)ball2 = Ball(canvas, 60, 60, 80, 80)ball1.move_ball()ball2.move_ball()root.mainloop()

鸿蒙传说

此功能似乎是罪魁祸首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 loopball2.move_ball()    # never gets called, because code is stuck one line above

蝴蝶不菲

它唯一移动一个,因为程序一次只读取一个变量。如果将程序设置为在球到达某个位置(例如画布的末端)时读取,则可以对程序进行编码以读取下一行并触发第二个球移动。但是,这一次只能移动一个。您的程序实际上停留在行上:ball1.move_ball()而且它永远不会行:ball2.move_ball()因为对循环的结束位置没有限制。否则,“ sundar nataraj”的回答将成功。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python