为了账号安全,请及时绑定邮箱和手机立即绑定

在Tkinter画布中移动球

在Tkinter画布中移动球

哈士奇WWW 2019-10-22 21:13:13
这是一个非常基本的程序,我想用它来制作两个移动的球,但实际上只有一个移动。我也尝试了一些变化,但无法使第二个球移动。另一个相关的问题-有些人使用该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 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()
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您绝对不应在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()


查看完整回答
反对 回复 2019-10-22
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

此功能似乎是罪魁祸首


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


查看完整回答
反对 回复 2019-10-22
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

它唯一移动一个,因为程序一次只读取一个变量。如果将程序设置为在球到达某个位置(例如画布的末端)时读取,则可以对程序进行编码以读取下一行并触发第二个球移动。但是,这一次只能移动一个。


您的程序实际上停留在行上:


ball1.move_ball()


而且它永远不会行:


ball2.move_ball()


因为对循环的结束位置没有限制。


否则,“ sundar nataraj”的回答将成功。


查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 768 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信