如何在 python 中使用 Tkinter 使用单个循环创建一系列矩形?

How to create a series of rectangles with a single loop using Tkinter in python?

我正在尝试根据存储在列表中的值绘制一系列矩形。

对于初学者来说,嵌套循环通常是可行的方法。然而,经过一些测试,结果证明这是一个非常糟糕的主意。

这是一个例子:

bs = 20
x_values = ['3', '4', '5', '6']
y_values = ['11', '11', '11', '11']

for X in x_values:
    for Y in y_values:
        x1 = int(X) * bs
        y1 = int(Y) * bs
        x2 = int(x1) + bs
        y2 = int(y1) + bs
        self.canvas.create_rectangle(x1, y1, x2, y2, fill='red', width=1,outline='white', tag='obj')

不用说,这是一个糟糕的想法。对于像这样的小尺寸的东西,它可能工作得很好。但是,如果元素列表增加,那将导致问题。总而言之,这个方法不行。

经过一些研究,我尝试了其他方法。

bs = 20
x_values = ['3', '4', '5', '6']
y_values = ['11', '11', '11', '11']

canvas.create_rectangle([int(X) * bs for X in x],
                    [int(Y) * bs for Y in y],
                    [(int(X) * bs) + bs for X in x],
                    [(int(Y) * bs) + bs for Y in y])

我想做的很简单。我没有像以前那样线性循环遍历所有值,而是决定动态生成元素 ,即 for 循环 returns 值,Tkinter 读取它并使用它作为坐标。然后当下一个值生成时,最后一个值将被转储。

出于某种原因,Tkinter 正在一次读取所有变量并返回错误:

_tkinter.TclError: wrong # coordinates: expected 0 or 4, got 16

我将如何解决这个问题?

假设您要绘制四个矩形,您可以将两个 x 和 y 坐标列表组合成一个 x,y 对列表,其中 zip:

coords = zip(x_values, y_values)

这将导致以下结果:

[('3', '11'), ('4', '11'), ('5', '11'), ('6', '11')]

如果您现在想要绘制四个矩形,其中每个坐标都用于定义实际坐标,您可以像这样遍历每一对:

for x1, y1 in zip(x_values, y_values):
    x1 = int(x1) * bs
    y1 = int(y1) * bs
    x2 = x1 + bs
    y2 = y1 + bs
    canvas.create_rectangle(x1,y1,x2,y2, fill="red")