2016-04-26 16 views
-2

Versuchen, durch eine Liste mit Rechtecken in ihnen zu iterieren. Dann entfernen/löschen Sie alle orangefarbenen Rechtecke aus der Liste. Ich habe ein Stück Code dafür geschrieben, aber bekomme keinen Fehler mehr.Iterieren durch eine Liste mit Selbst Parameter

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' gibt' None' ... so von groben 'für Artikel in None' ist nicht gültig Python –

+0

Sie nennen drei Objekt' tes'? –

+1

@PadraicCunningham ... aber fährt fort, keine von ihnen zu verwenden ... –

Antwort

0

randomRects ist eine Liste von Rechtecken zu schaffen, aber es ist nicht eine Liste von Rechtecken zurück. Es gibt den Standard-Rückgabewert None zurück. Wenn Sie versuchen, darüber zu iterieren (for i in self.randomRects()), durchlaufen Sie den Wert None, wodurch ein Fehler ausgegeben wird.

Das zweite Problem ist, dass self.rects eine Liste von Canvas-Objekt-IDs erstellt, aber Sie vergleichen die IDs mit der Zeichenfolge "Orange", die nie wahr sein wird. Canvas-Objekt-IDs sind Zahlen.

Was Sie tun müssen, ist a) Schleife über self.rects, und b) erhalten Sie die Farbe des Artikels vor dem Vergleich. Dann c) löschen Sie den Canvas-Artikel und d) aktualisieren Sie self.rects

Es gibt mehrere Möglichkeiten, dies zu erreichen. Folgendes ist eine Möglichkeit. Allerdings wird davon ausgegangen, dass Sie die zufälligen Rechtecke im Voraus erstellt haben. Die Art und Weise, wie Ihr Code funktionierte, Sie erstellten und löschten die Rechtecke gleichzeitig.

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 
Verwandte Themen