2017-09-22 1 views
0

J'ai le code suivant qui cherche à créer 2 instances de plus de la classe Ball, de différentes couleurs et à différents endroits. Actuellement, la méthode qui crée l'ovale et spécifie sa position est dans la méthode init.meilleur moyen d'appeler une méthode d'une classe pour changer l'emplacement tkinter classes python

Problème: J'ai essayé de créer ball2 et ball3 (en créant des instances de la classe Ball) mais cela n'a pas fonctionné. Ils écrasent ball1, pour des raisons évidentes.

Je suis après quelques suggestions pour la meilleure solution avec une réponse (code)

Est-il préférable d'appeler la méthode directement à partir de là où il est maintenant, et si oui, comment? (J'ai essayé diverses choses qui n'ont pas fonctionné). Sinon, est-ce plus pythonique ou efficace de créer une nouvelle méthode pour dessiner la balle, et si oui, pourriez-vous fournir cela comme une réponse.

Une réponse devrait idéalement contenir à la fois ce qui précède, avec des explications ou d'autres alternatives, le cas échéant.

code ci-dessous

class Ball: #create a ball class 
    def __init__(self,canvas,color): #initiliased with the variables/attributes self, canvas, and color 
     self.canvas=canvas #set the intiial values for the starting attributes 
     self.id=canvas.create_oval(30,30,50,50,fill=color) #starting default values for the ball 
     """ Note: x and y coordinates for top left corner and x and y coordinates for the bottom right corner, and finally the fill colour for the oval 
     """ 
     self.canvas.move(self.id,0,0) #thia moves the oval to the specified location 

    def draw(self): #we have created the draw method but it doesn't do anything yet. 
     pass 


ball1=Ball(canvas,'green') #here we are creating an object (green ball) of the class Ball 

ball2=Ball(canvas,'blue') 
ball3=Ball(canvas,'purple') 

Par exemple, pour essayer de le déplacer dans une méthode que j'ai essayé, mais sans succès:

def moveball(x_position,y_position): 
     self.canvas.move(self.id,0,0) 


ball3=Ball(canvas,'purple') 
ball3.moveball(100,100) 

Erreur:

ball3.moveball(100,100) 
TypeError: moveball() takes 2 positional arguments but 3 were given 
+0

Quel est exactement le problème que vous essayez de résoudre ici? S'il vous plaît voir http://xyproblem.info/ –

+0

J'ai modifié la question pour inclure le problème plus clairement. Les balles 2 et ball3 (instances) écrasent ball1.Je cherche une solution à ce problème de la manière la plus efficace - soit d'appeler l'attribut dans la classe __init__, soit de réparer ma tentative de créer une autre méthode, ce qui ne fonctionne pas (voir modifier) – MissComputing

Répondre

0

Je viens de trouver ceci, ce qui fonctionne. De toute évidence, attendez de voir si quelqu'un trouve quelque chose de mieux ou plus efficace.

Créer la méthode suivante:

def move(self,x,y): #we have created the draw method but it doesn't do anything yet. 
     canvas.move(self.id,x,y) 

Appel ball3 comme ceci:

ball3.move (100.200)

Ce produit une autre balle à l'écran dans un autre emplacement, comme la question le demande.

1

Pour éviter votre erreur, vous devez ajouter self comme argument pour moveball, s'il se trouve dans votre classe de balle. (Cela devrait être le premier argument)

Vos balles ne s'écrasent pas l'une l'autre, elles apparaissent juste l'une sur l'autre sur la toile dans l'ordre où vous les créez. Vous pouvez empêcher cela en les déplaçant après la création (spécifiez une valeur x et y) ou en transmettant les coordonnées initiales (x1, y1, x2, y2 ou x, y puis en utilisant un décalage).