【问题标题】:How to make many shapes quickly in tkinter如何在 tkinter 中快速制作多种形状
【发布时间】:2020-08-29 23:06:20
【问题描述】:

我正在尝试在 tkinter 中使用 Canvas 制作形状,并且进展顺利。但是,我正在尝试使用随机数制作动画,这些随机数具有不同大小的框在屏幕上移动。我想知道创建大约 20 或 30 个形状然后能够移动它们并更改颜色而无需为每个形状创建一行代码然后稍后引用它的最 Pythonic 方式是什么。然后,我可以使用 randint 函数将形状设置为不同的大小。

非常感谢

【问题讨论】:

  • 如果您不想单独创建每一个,可以循环创建它们。你试过吗?
  • 我需要同时在屏幕上看到多个形状,所以我想不出一种可行的方法
  • 为什么它不起作用?您可以使用循环在不到一秒的时间内轻松创建数千个画布项目。我建议你试试。
  • 我需要一种在屏幕上移动形状的方法。我目前的方法是使用canvas.move,它需要你把它放在一个循环中,然后逐个像素地移动它。这适用于一种形状,但我遇到的问题是将此过程用于多种形状
  • 循环创建它们并不能阻止您移动它们。

标签: python animation tkinter canvas


【解决方案1】:

您可以在一个循环中创建多个项目。将项目 ID 保存在列表中,然后您可以遍历项目以移动它们。

这是一个示例,它在随机位置创建 100 个具有随机颜色的项目,然后在每次迭代中以随机数量为它们设置动画。

import tkinter as tk
import random

root = tk.Tk()

canvas = tk.Canvas(root, bg="black", width=400, height=400)
canvas.pack(fill="both", expand=True)

items = []
for i in range(100):
    x = random.randint(10, 490)
    y = random.randint(10, 490)
    size = random.randint(20,50)
    color = random.choice(("red", "orange", "green", "blue", "white", "yellow"))
    item_id = canvas.create_rectangle(x, y, x+size, y+size, fill=color, outline="white")
    items.append(item_id)

def animate():
    for item_id in items:
        distance = random.randint(0, 5)
        canvas.move(item_id, 0, distance)
    canvas.after(100, animate)

animate()
root.mainloop()

这是一种面向对象的方法,我们使用一个类来定义一个项目,并且类实例可以为自己设置动画。

import tkinter as tk
import random

class RandomItem:
    def __init__(self, canvas):
        self.canvas = canvas
        self.velocity = random.randint(1,5)
        x = random.randint(10, 490)
        y = random.randint(10, 490)
        size = random.randint(20,50)
        color = random.choice(("red", "orange", "green", "blue", "white", "yellow"))
        self.item_id = canvas.create_rectangle(x, y, x+size, y+size, fill=color)
        self.fall()

    def fall(self):
        self.canvas.move(self.item_id, 0, self.velocity)
        self.canvas.after(100, self.fall)


root = tk.Tk()

canvas = tk.Canvas(root, bg="black", width=500, height=500)
canvas.pack(fill="both", expand=True)

for i in range(100):
    item = RandomItem(canvas)

root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多