Python 如何在Tkinter中以不同的速度设置球的动画?

Python 如何在Tkinter中以不同的速度设置球的动画?,python,canvas,tkinter,tk,Python,Canvas,Tkinter,Tk,这是我目前掌握的代码。我似乎无法解决的问题是,我需要球以不同的速度移动,而且大小也不同。我需要做的最后一步是让球从底部回到顶部。因此,最终产品应该是多种尺寸的球,以不同的速度移动到画布顶部,然后出现在底部。谢谢你的帮助 一种解决方案是创建一个表示一个球的自定义类。让代码将球移动到该类中。每个球都有自己的速度和方向 下面是一个非常简单的球落地的例子。您需要为反弹、朝不同方向下落等添加逻辑 import time, random from tkinter import * class Box( F

这是我目前掌握的代码。我似乎无法解决的问题是,我需要球以不同的速度移动,而且大小也不同。我需要做的最后一步是让球从底部回到顶部。因此,最终产品应该是多种尺寸的球,以不同的速度移动到画布顶部,然后出现在底部。谢谢你的帮助

一种解决方案是创建一个表示一个球的自定义类。让代码将球移动到该类中。每个球都有自己的速度和方向

下面是一个非常简单的球落地的例子。您需要为反弹、朝不同方向下落等添加逻辑

import time, random
from tkinter import *

class Box( Frame ):

   def __init__( self ):      # __init__ runs when Box() executes     
      Frame.__init__( self )  # Frame is the top level component
      self.pack() 
      self.master.title( "Canvas animation" ) 
      self.master.geometry( "400x400" ) # size in pixels
      label = Label(self, text="    Bubbles    ")
      label.grid(row=1, column=1)
      # create Canvas component
      self.myCanvas = Canvas( self ) 
      self.myCanvas.grid(row=2, column=1)
      self.myCanvas.config(bg = 'cyan', height = 350, width = 350)

      self.balls = [] #list of balls belongs to the Box 

      self.paint()

      self.animate()

   def paint( self ):

      #create a list of balls
      for i in range(35):

      x1, y1 = random.randint(35,315), random.randint(35,315)
      x2, y2 = x1 + 30 , y1 + 30 #size


      ballObjectId = self.myCanvas.create_oval\
                     ( x1, y1, x2, y2, fill = '')
      self.balls.append([ballObjectId, x1, y1])

  self.myCanvas.update()   
  print ("paint done")

   def animate( self ):
      #animate the list of balls
      for i in range(1000):
          for i in range(len(self.balls)):

          self.myCanvas.delete(self.balls[i][0])   #delete and redraw to move
          self.balls[i][1] += random.randint(-2,2) #change coordinates
          self.balls[i][2] += random.randint(-10,0)
          x1, y1 = self.balls[i][1], self.balls[i][2]
          x2, y2 = x1 + random.randint(30,31) , y1 + random.randint(30,31)

          self.balls[i][0]=(self.myCanvas.create_oval\
                        ( x1, y1, x2, y2, fill = ''))
          self.myCanvas.update()   


def main():
   Box().mainloop() 

if __name__ == "__main__":
   main()
您可以将其与以下内容一起使用:

class Ball(object):
    def __init__(self, canvas, x=10, y=10, radius=10, color="red", speed=1):
        self.canvas = canvas
        self.speed = speed
        self.canvas_id = canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
                                            outline=color, fill=color)
    def move(self, on=True):
        self.canvas.move(self.canvas_id, self.speed, self.speed)

paint()
animate()
方法中的缩进错误。你的
for
循环根本不起作用。只需在
for
s下的
for
循环中缩进一个选项卡,即可获得所有您想要的代码;该程序不会编译时出现缩进错误。这可能是因为将代码粘贴到问题中。
self.canvas = Canvas(...)
self.balls = []
for i in range(10):
    <compute x, y, color, speed, ...>
    ball = Ball(self.canvas, x, y, radius, color, speed)
    self.balls.append(ball)
def animate(self):
    for ball in self.balls:
        ball.move()
    self.canvas.after(30, self.animate)