【问题标题】:Tkinter access Canvas Objects created by Loop outside the loopTkinter 在循环外访问 Loop 创建的 Canvas 对象
【发布时间】:2021-01-05 18:53:23
【问题描述】:

我正在尝试操作由 Tkinter Canvas 上的循环创建的一些 Canvas 对象。不幸的是,我无法访问循环外这些矩形的坐标,只能访问其中一个。如何访问由循环外的循环创建的所有矩形以获取它们的坐标以及操作它们?这个问题可能没有意义,所以如果你不明白,请问我,我会尽力解释得更好。谢谢!

    for y in range(2):
        for x in range(2):
            x1 = x*230
            y1 = y*230
            height = x1 + 200
            width = y1 + 200
            music_catalog_rect = canvas.create_rectangle((x1, y1, height, width), fill='red')
            canvas.move(music_catalog_rect, 180, 20)

【问题讨论】:

  • 您需要将music_catalog_rect 的每个值存储在循环外部存在的某个容器中:也许将它们附加到列表中,也许将它们存储在由(x, y) 键入的字典中。跨度>
  • 感谢您的快速回答。我试图将它们附加到列表中,但后来不知道如何访问它们以操纵它们。例如,当我附加它们时,我得到了一个值列表 (9,10,11,12)。
  • 您可以将其中一个值作为参数传递给相关的 Canvas 方法 - 例如 canvas.move()。您很可能会遍历列表并依次对每个值调用这样的方法。
  • 成功了!非常感谢!

标签: python tkinter tkinter-canvas


【解决方案1】:

您应该将项目存储在某种数据结构中。然后,您可以遍历结构以挑选特定值或遍历所有值。

例如,您可以将它们存储在列表中:

rects = []
for y in range(2):
    for x in range(2):
        ...
        item = canvas.create_rectangle(...)
        rects.append(item)
        ...

这使您可以轻松地遍历所有项目:

for item in rects:
    canvas.move(item, ...)

如果保留 x,y 数据很重要,您可以使用 x,y 作为字典的键:

rects = {}
for y in range(2):
    for x in range(2):
        ...
        item = canvas.create_rectangle(...)
        rects[(x,y)] = item
        ...

然后,您执行以下操作:

canvas.move(rects[(3,4)], ...)

【讨论】:

  • 非常感谢,这个解决方案效果很好。
  • 我实际上想在这个话题上再问一个问题,我尝试了 canvas.move(rects[(3,4)], ...) 但它返回了 TypeError: list indices must be integers ,而不是元组。有什么办法解决这个问题?
  • @AliKesserwani:如果您收到“列表索引”错误,那么您将 rects 定义为列表而不是字典。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
相关资源
最近更新 更多