使用self参数遍历列表

时间:2016-04-26 21:41:44

标签: python list class python-3.x

尝试遍历包含矩形的列表。然后从列表中删除/删除橙色的所有矩形。我为它编写了一段代码但仍然没有发现错误。

from tkinter import *
import random
root = Tk()
from Stack import Stack
from my_queue import *

class Recta:

  def __init__(self, height=60, width=80 ,colours= []):
    self.height = height
    self.width = width
    self.canvas = Canvas(root)
    self.canvas.pack()
    self.colours = ["red", "orange"]
    self.rects = []
    self.stack = Stack()
    self.queue = Queue()

  def randomRects(self):
    w = random.randrange(300)
    h = random.randrange(200)
    self.rects.append(self.canvas.create_rectangle(0, 0, w, h, fill= random.choice(self.colours)))

  def remove_all_orange_shapes(self):
    for i in self.randomRects():
        if i == "orange": 
          return self.canvas.delete(self.rects.pop())
        else:
          continue 

tes = Recta()
tes= Stack()
tes = Queue()
root.mainloop()

1 个答案:

答案 0 :(得分:0)

randomRects正在创建一个矩形列表,但它不是返回一个矩形列表。它返回默认返回值None。当您尝试迭代它(for i in self.randomRects())时,您正在迭代值None,这将引发错误。

第二个问题是self.rects正在创建画布对象id的列表,但是你要将id与字符串" orange"进行比较。这永远不会是真的。画布对象ID是数字。

您需要做的是a)循环self.rects,以及b)在进行比较之前获取项目的颜色。然后,c)删除画布项,并d)更新self.rects

有几种方法可以实现这一目标。以下是一种方式。但是,它假设您已经提前创建了随机矩形。您的代码工作方式,您正在同时创建和删除矩形。

def remove_all_orange_shapes(self):
    new_rects = []
    for i in self.rects:
        color = self.canvas.itemcget(i, "fill")
        if color == "orange": 
            # delete the orange ones ...
            self.canvas.delete(i)
        else:
            # ... and save the non-orange ones
            new_rects.append(i)
    self.rects = new_rects