尝试遍历包含矩形的列表。然后从列表中删除/删除橙色的所有矩形。我为它编写了一段代码但仍然没有发现错误。
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()
答案 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