По сути, у меня есть многоугольник, нарисованный на моем холсте, и я хочу продублировать его, чтобы он заполнил весь холст.
Я новичок в программировании в целом и думал, что могу использовать цикл for, но на самом деле это не сработало так, как я хотел, поэтому мне любопытно, может ли кто-нибудь показать мне, как я могу этого добиться.
Код показывает, что я хочу сделать, но я не хочу переписывать это 10 раз, чтобы заполнить весь холст.
from tkinter import *
root = Tk()
canvas = Canvas()
points = [125, 100, 225, 100, 225, 100, 250, 150, 250, 150, 100, 150]
canvas.create_polygon(points, outline = "blue", fill = "orange", width = 2)
canvas.pack()
points = [125, 150, 225, 150, 225, 150, 250, 200, 250, 200, 100, 200]
canvas.create_polygon(points, outline = "blue", fill = "orange", width = 2)
canvas.pack()
root.mainloop()






Во-первых, вам нужно упаковать холст только один раз.
Затем вы можете использовать цикл for для перемещения точек для каждого нового многоугольника. Один изящный трюк — использовать zip(), который будет объединять точки со списком смещений, но только для каждого другого элемента в списке. Пример:
from tkinter import *
root = Tk()
canvas = Canvas()
canvas.pack()
points = [125, 100, 225, 100, 225, 100, 250, 150, 250, 150, 100, 150]
shift_list = [0, 50, 100, 150] # values to shift polygon for each repetition
for delta_y in shift_list:
shifted = []
for x, y in zip(points[::2], points[1::2]): # Loop through points
shifted.append(x)
shifted.append(y+delta_y)
canvas.create_polygon(shifted, outline = "blue", fill = "orange", width=2)
root.mainloop()
Линия:
for x, y in zip(points[::2], points[1::2])
возьмет точки списка, но только каждый другой элемент points[::2], и объединит его с точками списка, но только со всеми остальными элементами, начиная со второго элемента points[1::2], что даст значения x и y цикла for для каждой точки. Этот тип техники с использованием zip() очень полезен, и вы должны держать его близко к сердцу.
Затем просто добавьте значение смещения и начертите полигон.