2016-06-26 32 views
2

Ich bin neu in Python und habe ein wenig Probleme mit Objektklassen. Ich habe Code erstellt, wo Ballobjekte von der Seite der Wand abprallen. Ich möchte einen Ball löschen, nachdem er angeklickt wurde. Ich habe verschiedene Methoden ausprobiert, aber sie haben alle zu Fehlern geführt. Unten ist mein Code für die Bälle, die von den Wänden springen. Wie kann ich diesen Code bearbeiten, um die Bälle nach dem Klicken zu löschen? Vielen Dank!Python: Wie man ein Objekt aus der Klasse löscht?

from Tkinter import * 
import random 
import time 

canvasWidth=480 
canvasHeight=320 


root= Tk() 
canvas=Canvas(root,width=canvasWidth,height=canvasHeight, bg='white') 
root.title('RaspPi') 
canvas.pack() 

class Ball: 
    def __init__(self): 
      self.ballSize = 30 
      self.xposition = random.randint(0 + self.ballSize, canvasWidth - self.ballSize) 
      self.yposition = random.randint(0 + self.ballSize, canvasHeight - self.ballSize) 
      self.shape=canvas.create_oval(self.xposition,self.yposition,self.xposition+self.ballSize,self.yposition+self.ballSize, fill='black',activefill="grey",width=0) 
      self.xspeed = random.randrange(-3,3) 
      self.yspeed = random.randrange(-3,3) 



    def move(self): 
     canvas.move(self.shape, self.xspeed, self.yspeed) 
     pos = canvas.coords(self.shape) 
     if pos[2] >= canvasWidth or pos[0] <= 0: 
      self.xspeed = -self.xspeed 
     if pos[3] >= canvasHeight or pos[1] <= 0: 
      self.yspeed = -self.yspeed 


balls=[] 
for i in range(20): 
    balls.append(Ball()) 

while True: 
    for ball in balls: 
     ball.move() 

    root.update() 
    time.sleep(0.01) 

root.mainloop() 
+0

Dies scheint eher ein Problem auf der Tkinter-Seite als die Python-Seite. –

+1

Errr, entfernen Sie einfach die entsprechende Instanz aus der "Bälle" -Liste, das gelöschte Objekt wird nicht iteriert werden. –

+0

Dies scheint nichts mit "Delet [ing] Objekt [s] aus [a] Klasse" zu tun zu haben. Sie müssen die Tkinter-API lesen, um zu erfahren, wie Sie ein Objekt aus dem Spiel entfernen. – Carcigenicate

Antwort

0

Verwenden Sie die Bind-Methode der Klassenarbeitsfläche und löschen Sie das angeklickte Oval. Ihre for-Schleife sollte eine Ausnahmebehandlung haben, da ein gelöschtes Objekt keine Koordinaten oder Geschwindigkeit haben kann. Die Funktion del() wird normalerweise zum Löschen von Objekten verwendet.

from Tkinter import * 
import random 
import time 

canvasWidth = 480 
canvasHeight = 320 

root = Tk() 
canvas = Canvas(root, width=canvasWidth, height=canvasHeight, bg='white') 
root.title('RaspPi') 
canvas.pack() 


class Ball: 
    def __init__(self): 
      self.ballSize = 30 
      self.xposition = random.randint(0 + self.ballSize, canvasWidth - self.ballSize) 
      self.yposition = random.randint(0 + self.ballSize, canvasHeight - self.ballSize) 
      self.shape=canvas.create_oval(self.xposition,self.yposition,self.xposition+self.ballSize,self.yposition+self.ballSize, fill='black',width=0) 
      self.xspeed = random.randrange(-3,3) 
      self.yspeed = random.randrange(-3,3) 

    def move(self): 
     canvas.move(self.shape, self.xspeed, self.yspeed) 
     pos = canvas.coords(self.shape) 
     if pos[2] >= canvasWidth or pos[0] <= 0: 
      self.xspeed = -self.xspeed 
     if pos[3] >= canvasHeight or pos[1] <= 0: 
      self.yspeed = -self.yspeed 


balls=[] 
for i in range(20): 
    balls.append(Ball()) 


def click(event): 
    if canvas.find_withtag(CURRENT): 
     canvas.delete(CURRENT) 

canvas.bind("<Button-1>", click) 

while True: 
    for ball in balls: 
     try: 
      ball.move() 
     except: 
      del(ball) 

    root.update() 
    time.sleep(0.01) 

root.mainloop() 

UPDATE

Überprüfen Sie einfach in Ihrer Methode move, wenn die Liste pos nicht Null ist. Wenn es Null ist, löschen Sie einfach das Objekt selbst. Es ist in Ordnung, wenn Sie nur den Canvas löschen, aber wenn Sie für die Speichernutzung sorgen, ist dies die beste Option, die ich mir vorstellen kann.

from Tkinter import * 
import random 
import time 

canvasWidth = 480 
canvasHeight = 320 

root = Tk() 
canvas = Canvas(root, width=canvasWidth, height=canvasHeight, bg='white') 
root.title('RaspPi') 
canvas.pack() 


class Ball: 
    def __init__(self): 
      self.ballSize = 30 
      self.xposition = random.randint(0 + self.ballSize, canvasWidth - self.ballSize) 
      self.yposition = random.randint(0 + self.ballSize, canvasHeight - self.ballSize) 
      self.shape=canvas.create_oval(self.xposition,self.yposition,self.xposition+self.ballSize,self.yposition+self.ballSize, fill='black',width=0) 
      self.xspeed = random.randrange(-3,3) 
      self.yspeed = random.randrange(-3,3) 

    def move(self): 
     canvas.move(self.shape, self.xspeed, self.yspeed) 
     pos = canvas.coords(self.shape) 
     if len(pos) != 0: 
      if pos[2] >= canvasWidth or pos[0] <= 0: 
       self.xspeed = -self.xspeed 
      if pos[3] >= canvasHeight or pos[1] <= 0: 
       self.yspeed = -self.yspeed 
     else: 
      del(self) 




balls=[] 
for i in range(20): 
    balls.append(Ball()) 


def click(event): 
    if canvas.find_withtag(CURRENT): 
     canvas.delete(CURRENT) 

canvas.bind("<Button-1>", click) 

while True: 
    for ball in balls: 
     ball.move() 

    root.update() 
    time.sleep(0.01) 

root.mainloop() 
+0

Vielen Dank !! Gibt es eine Möglichkeit, es ohne Versuch und Ausnahme zu tun? – user6515293

+0

yeah sure update: P – Blind0ne

+0

Vielen Dank! Du bist der beste! – user6515293

Verwandte Themen