簡體   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