【发布时间】:2017-05-10 19:02:49
【问题描述】:
给定列表中存储的值,我正在尝试绘制一系列矩形。
对于初学者来说,嵌套循环通常是要走的路。然而,经过一些测试,结果证明这是一个非常糟糕的主意。
这是一个例子:
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 循环返回值,Tkinter 读取它并将其用作坐标。然后在生成下一个值时,将转储最后一个值。
出于某种原因,Tkinter 一次读取所有变量并返回错误:
_tkinter.TclError: wrong # coordinates: expected 0 or 4, got 16
我将如何解决这个问题?
【问题讨论】:
-
这些是列表推导,即您正在生成列表,而不是整数。它不被称为
create_rectangles():-) 所以你的第一种方法似乎是要走的路(尽管你没有清楚地说明你想要实现的目标)。您要创建多少个矩形? -
我认为您的第一种方法唯一有问题的是它在四个位置(即
(3,11)、(4,11)、(5,11)和(6,11))的每一个位置绘制了四个矩形。您是否只想在每个位置绘制一个矩形? -
如您所见,列表中有4个元素,因此是四个矩形
-
@FamousJameous 就是这样。我只想在每个位置绘制一个矩形。
-
假设
x_values有四个数字,y_values有四个数字,你想画多少个矩形?一?四?十六岁?
标签: python python-2.7 python-3.x tkinter tkinter-canvas