如何在python中使用Tkinter创建一个带有单个循环的矩形?

时间:2017-05-10 19:02:49

标签: python python-2.7 python-3.x tkinter tkinter-canvas

我正在尝试绘制一系列矩形,给出存储在列表中的值。

对于初学者来说,嵌套循环通常是要走的路。然而,经过一些测试后,结果却是一个非常糟糕的主意。

以下是一个例子:

<input type="text" :value="ticket" readonly="readonly">

毋庸置疑,这是一个可怕的主意。对于像这样的小尺寸的东西,它可能工作正常。但是,如果元素列表增加,则会导致问题。总而言之,这种方法是不行的。

经过一番研究,我尝试了别的东西。

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')

我试图做的很简单。我没有像以前那样线性地循环遍历所有值,而是决定生成动态元素,也就是说,for循环返回值,Tkinter读取它并将其用作坐标。然后,当生成下一个值时,将转储最后一个值。

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

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])

我将如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

假设您想要绘制四个矩形,您可以将两个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")