【问题标题】:How to create a series of rectangles with a single loop using Tkinter in python?python - 如何在python中使用Tkinter创建一系列带有单个循环的矩形?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-07-19
    • 1970-01-01
    • 2021-10-15
    • 2018-01-16
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多