当前位置: 首页 > 知识库问答 >
问题:

在Tkinter画布中移动球

严俊友
2023-03-14

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

我也尝试过一些变化,但无法让第二个球移动;另一个相关问题-一些人使用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()

共有3个答案

李嘉胜
2023-03-14

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

您的程序被卡在线路上:

ball1。移动球()

而且它永远不会到达终点:

ball2.move_ball

因为循环应该结束的地方没有限制。

否则,“sundar nataraj”的答案就可以了。

单于皓轩
2023-03-14

这个功能似乎是罪魁祸首

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
淳于坚壁
2023-03-14

您不应该在图形用户界面程序中放入无限循环——已经有一个无限循环在运行。如果您希望您的球独立移动,只需取出循环并让move_ball方法在事件循环上对其自身进行新的调用。有了这个,你的球将永远继续移动(这意味着你应该在那里放一些检查来防止这种情况发生)

我稍微修改了你的程序,删除了无限循环,稍微减慢了动画的速度,并且对它们的移动方向使用了随机值。所有这些更改都在move\u 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()
 类似资料:
  • 问题内容: 这里是我想要的描述:在tkinter画布中绘制几何对象(在此为矩形)的集合,然后蜜蜂通过鼠标探索该画布。单击并拖动以移动画布,滚动放大和缩小。 使用本主题,我找到了单击和拖动部分:使用Mousewith-mouse 移动tkinter画布 我设法写了一些滚动缩放。移动和缩放都可以很好地分开工作。 问题 :如果移动然后放大,则变焦的焦点不再是光标所在的位置。 有什么建议吗? 这是一段要测

  • 问题内容: 我正在尝试使用圆在Tkinter中为一个简单的太阳系建模,并在画布中四处移动。但是,我一直在努力寻找一种使它们动起来的方法。我环顾四周,发现该功能与创建动画循环结合在一起。我尝试使用参数来烦躁,以改变偏移量并在弯曲路径中创建运动,但是在尝试递归或循环执行时却失败了。这是我到目前为止的代码: 问题答案: 这里显示了一种使用tkinter方法更新对象和关联的画布对象的位置的方法。它使用生成

  • 主要内容:Canvas控件基本属性,Canvas控件绘图常用方法Canvas 控件具有两个功能,首先它可以用来绘制各种图形,比如弧形、线条、椭圆形、多边形和矩形等,其次 Canvas 控件还可以用来展示图片(包括位图),我们将这些绘制在画布控件上的图形,称之为“画布对象”。 每一个画布对象都有一个“唯一身份ID”,这是 Tkinter 自动为其创建的,从而方便控制和操作这些画布对象。 通过 Canvas 控件创建一个简单的图形编辑器,让用户可以达到自定义图形的

  • 2 Tkinter 画布方法 本节罗列 Canvas 对象的方法,供需要的读者编程时参考。具体用法请查阅参考资料。 创建图形项的方法 create_arc(<限定框>, <选项>):创建弧形,返回标识号 create_bitmap(<位置>, <选项>):创建位图,返回标识号 create_image(<位置>, <选项>):创建图像,返回标识号 create_line(<坐标序列>, <选项>)

  • 问题内容: 我想使用python3和tkinter创建一个虚拟的宠物风格游戏。到目前为止,我已经有了主窗口并开始放入标签,但是我遇到的问题是播放动画gif。我在这里搜索并找到了一些答案,但是他们不断抛出错误。我发现使用PhotoImage的结果具有gif的索引位置,并在一定范围内继续。 当我在终端中使用“ pyhton3 main.py”运行此命令时,出现以下错误: _tkinter.TclErr

  • 问题内容: 我正在尝试制作一个程序来使用Tkinter显示动画GIF。这是我最初使用的代码: test.gif是以下GIF: 这可以正常工作,但是GIF的质量很糟糕。我尝试将其更改为以下内容: 但是,这偶尔会闪烁图像。虽然图片看起来不错,但是作为程序却毫无用处。我究竟做错了什么? 问题答案: 首先,您要为每个帧创建一个新的画布对象。最终,您将有成千上万的图像相互叠加。这是非常低效的;当您开始具有数