繁体   English   中英

Python | Tkinter:将多个不同的对象移动到一起

[英]Python | Tkinter : Move multiple and different objects to gether

我已经搜索了很多,但是我找不到我需要的确切答案(或者我无法正确理解)。 在我的代码中有 1 个矩形,8 行。 他们正在同步移动。 但我想在我的 canvas 中添加一堆圆圈。 为此,我创建了很多行“create_oval”对象。 这是没有意义的,因为下一步我可能需要 canvas 中的数千个球。 我已经尝试了很多循环等,以找到一种用缩短方法创建圆圈的方法,但我无法实现我所需要的。 这是我的代码。

from tkinter import *
from random import randint

tk = Tk()




W, H =600, 500

canvas = Canvas(tk, width=W, height=H)
canvas.pack()

rectangle= canvas.create_rectangle(50, 250, 550, 50, fill="blue")

line1 = canvas.create_line(370, 70, 550,70,fill="black")
line2 = canvas.create_line(330, 90, 550,90,fill="black")
line3 = canvas.create_line(290, 110, 550,110,fill="black")
line4 = canvas.create_line(250, 130, 550,130,fill="black")
line5 = canvas.create_line(210, 150, 550,150,fill="black")
line6 = canvas.create_line(170, 170, 550,170,fill="black")
line7 = canvas.create_line(130, 190, 550,190,fill="black")
line8 = canvas.create_line(90, 210, 550,210,fill="black")

line9 = canvas.create_line(50, 230, 550,230,fill="black")


ball1 = canvas.create_oval(550,50,545,55, fill="red")
ball2 = canvas.create_oval(550,50,545,55, fill="red")
ball3 = canvas.create_oval(550,50,545,55, fill="red")
ball4 = canvas.create_oval(550,50,545,55, fill="red")
ball5 = canvas.create_oval(550,50,545,55, fill="red")
ball6 = canvas.create_oval(550,50,545,55, fill="red")
ball7 = canvas.create_oval(550,50,545,55, fill="red")
ball8 = canvas.create_oval(550,50,545,55, fill="red")

Xspeed = 10
Yspeed = 0




def moveTable():

    global Xspeed,Yspeed    

    canvas.move(table, Xspeed, Yspeed)

    canvas.move(line1, Xspeed, Yspeed)
    canvas.move(line2, Xspeed, Yspeed)
    canvas.move(line3, Xspeed, Yspeed)
    canvas.move(line4, Xspeed, Yspeed)
    canvas.move(line5, Xspeed, Yspeed)
    canvas.move(line6, Xspeed, Yspeed)
    canvas.move(line7, Xspeed, Yspeed)
    canvas.move(line8, Xspeed, Yspeed)
    canvas.move(line9, Xspeed, Yspeed)


    canvas.move(ball1, Xspeed-randint(5,10),Yspeed+randint(5,10))
    canvas.move(ball2, Xspeed-randint(5,10),Yspeed+randint(5,10))
    canvas.move(ball3, Xspeed-randint(5,10),Yspeed+randint(5,10))
    canvas.move(ball4, Xspeed-randint(5,10),Yspeed+randint(5,10))
    canvas.move(ball5, Xspeed-randint(5,10),Yspeed+randint(5,10))
    canvas.move(ball6, Xspeed-randint(5,10),Yspeed+randint(5,10))
    canvas.move(ball7, Xspeed-randint(5,10),Yspeed+randint(5,10))
    canvas.move(ball8, Xspeed-randint(5,10),Yspeed+randint(5,10))

    left,top,right,bot = canvas.coords(table)
    if(left == 60 or left == 40):
        Xspeed = -Xspeed
    
    canvas.after(100, moveTable)


moveTable()

tk.mainloop()

这可能很简单,但我看不到。

如果将标签分配给一个或多个小部件,则可以同时影响它们。

这是一个垂直移动所有红色项目和水平移动所有绿色项目的示例,所有这些都只使用两个move命令:

import tkinter as tk
import random

root = tk.Tk()

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

for i in range(20):
    x = random.randint(10, 110)
    y = random.randint(10, 110)
    width = random.randint(10, 30)
    height = random.randint(10, 30)
    canvas.create_rectangle(x, y, x+width, y+height, fill="red", tags=("red",))
    canvas.create_rectangle(x, y, x+width, y+height, fill="green", tags=("green",))

def animate():
    canvas.move("red", 0, 1)
    canvas.move("green", 1, 0)
    canvas.after(20, animate)

animate()
root.mainloop()

您也可以将项目保存到列表并遍历列表

items = []
for i in range(100):
    item = canvas.create_oval(...)
    items.append(item)
...
for item in items:
    canvas.move(item, ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM