2016-04-26 8 views
-2

矩形のリストを反復しようとしています。次に、リストからオレンジ色の四角形をすべて削除/削除します。私はそれのためのコードを書いたが、itterableエラーを取得し続ける。自己パラメータリストで反復する

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

は 'randomRects'がNONE'でアイテムに対して' NONE' ... '粗いのように、返すあなたは3オブジェクト' tes'に名前を付ける有効なPython –

+0

ではないでしょうか? –

+1

@PadraicCunningham ...しかし、それらのどれも使用しないで... –

答えて

0

randomRects長方形のリストを作成するが、それは長方形のリストを返すではありません。それはNoneのデフォルトの戻り値を返しています。それを反復しようとすると(for i in self.randomRects())、値Noneを反復しているため、エラーが発生します。 はキャンバスオブジェクトIDのリストを作成していますが、idを文字列 "orange"と比較していますが、これは決して真実ではありません。 Canvasオブジェクト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