# Autres langages > Python > GUI >  vpython 2.7 erreur avec dfinition __init__

## cecile vb

Bonjour,

Je suis tudiante en premire anne bio-ingnieur, et je dois programmer le jeu Lunar Lander.

Je recois cette erreur

TypeError: __init__() takes exactly 1 argument (5 given)


qui est relate au morceau de code ci-dessous, mais je ne vois pas o est ma faute!
Quelqu'un  la rponse  ma question?

class Lander_View(object):
    def __init__(self,owner):
        self.owner = owner 
        self.frame = frame ()
        curve(frame, pos=[(-11,17),(-8,17),(-8,15),(-11,15),(-11,17)], radius = 0, color= color.white)
        curve(frame, pos=[(-11,16),(-12,14),(-10,15)], radius =0, color = color.white)
        curve(frame, pos=[(-8,16),(-7,14),(-9,15)], radius =0, color = color.white)
        curve(frame, pos=[(-10,15),(-9.5,12),(-9,15)], radius=0, visible= False)


Dans mon code, les lignes sont mises  la bonne hauteur, mais ici tout se met  ligne ...

Merci d'avance  ::):

----------


## PauseKawa

Bonjour,

L'erreur est pourtant explicite:



> TypeError: __init__() takes exactly 1 argument (5 given)


__init__ attend un argument et vous en donnez 5 lors de l'instanciation.


```

```

Par contre ce n'est pas la classe Lander_View, pour ce qui est du code prsent, qui retourne cette erreur car deux arguments sont attendus: self qui reprsente l'instance et l'argument owner.


```

```

Pour l'indentation slectionnez le code puis cliquez sur le dise #.

@+

----------


## cecile vb

Merci d'avoir ragi si rapidement.

Si je comprends bien l'erreur, j'aurais donn trop d'arguments  une fonction __init__. Mais quand je controle mon code, je ne vois pas d'endroit o j'ai mis plus que 'owner' en 'self' comme 'argument'

Si la faute ne vient pas de la partie de code que j'ai donn la dernire fois, il viendra peut -tre de la partie suivante?

class Game_View(object):
    def __init__(self, owner):
        self.owner = owner

        self.frame = frame()
        # maanoppervlak
        curve(frame=f, pos=[(-20,-20),(-17,-17)], radius = 0, color = color.red)
        curve(frame=f, pos=[(-17,-17),(-9,-17)], radius = 0, color= color.green)
        curve(frame=f, pos=[(-9,-17),(-6,-18),(-2,-15),(2,-17)], radius = 0, color = color.red)
        curve(frame=f, pos=[(2,-17),(10,-17)], radius = 0, color = color.green)
        curve(frame=f, pos=[(10,-17),(15,-19),(18,-15),(20,-20)], radius = 0, color = color.red)
        # self.body = f

        side = owner.size
        thk = 0.1
        s2 = 2*side - thk
        s3 = 2*side + thk
        box(pos=( side, 0, 0), length=thk, height=s2, width=0, color = color.blue)
        box(pos=(-side, 0, 0), length=thk, height=s2, width=0, color = color.blue)
        box(pos=(0, -side, 0), length=s3, height=thk, width=0, color = color.blue)
        box(pos=(0, side, 0), length=s3, height=thk, width=0, color = color.blue)
        scene.background = (0,0,0) 

En faite, l'erreur que IDLE donne et plus longue:

Traceback (most recent call last):
  File "E:\lunar lander\spel_met_nieuwe_code.py", line 142, in <module>
    nieuw_spel = Moon_Lander_Game()
  File "E:\lunar lander\spel_met_nieuwe_code.py", line 14, in __init__
    self.lander = Lander(self)
  File "E:\lunar lander\spel_met_nieuwe_code.py", line 50, in __init__
    self.view = Lander_View(self)
  File "E:\lunar lander\spel_met_nieuwe_code.py", line 90, in __init__
    curve(frame, pos=[(-11,17),(-8,17),(-8,15),(-11,15),(-11,17)], radius = 0, color= color.white)# rechthoek
TypeError: __init__() takes exactly 1 argument (5 given)mais, je sais difficelement mettre tout mon code dans un message...

la ligne 90 c'est la 5ime ligne du code dans le mail prcdent, c'est pour cela que je pensais que la faute se troivait dans cette partie de code

Je ne comprends pas trop 

Ccile

----------


## PauseKawa

> File "E:\lunar lander\spel_met_nieuwe_code.py", line 90, in __init__
>     curve(frame, pos=[(-11,17),(-8,17),(-8,15),(-11,15),(-11,17)], radius = 0, color= color.white)# rechthoek


Il y a bien 5 arguments (4 + self) lors de l'instanciation de curve.

----------


## VinsS

Salut,

Utilises les balises code pour que ton script soit plus lisible. (L'icne *#*)


Tu n'as qu'un seul fichier dans ton code ?

Vu comme tel a a l'air trange, ce doit donc tre une btise, simplement on ne l'a pas sous les yeux.

Tu peux mettre ton code en entier en attachement si il est trop long.

----------


## cecile vb

J'ai mis tout mon code dans un attachement, le travail est en nerlandais (pour info).

Comment puis-je rduire les 5 arguments  1 tout en gardant les courbes ?

----------


## PauseKawa

> Comment puis-je rduire les 5 arguments  1 tout en gardant les courbes ?


Aucune ide mais suivant les exemples du site cela ne viens pas de la.
Ou....


```
curve(frame,
```



```
curve(frame=self.rame,
```

?

----------


## wiztricks

Salut,
Coder est un exercice de prcision:



```

```

Est-ce que curve prend en premier paramtre une classe telle que frame?

curve est une primitive "simple".

Avant de l'intgrer dans un programme "compliqu", pourquoi ne pas essayer de faire fonctionner le truc avec des appels simples pass  la console:



```

```

Dans le cas du programme, avec frame en premier paramtre:


```

```

- W

----------


## cecile vb

Je ne comprends pas pourquoi ca ne marche pas, vu qu'avec ce code si il ne me donne aucune faute et j'utilise galement 'frame' .

(c'est le code d'une ancienne version de mon jeu)




```

```


@ PauseKawa : ca ne marche pas avec tes propositions  ::(:

----------


## wiztricks

Utilisez "frame" comme keyword et lui passer une instance de "frame" ou passer en paramtre la classe frame...  se ressemble, mais ce n'est pas la mme chose.
La question est: vous voulez faire quoi?
-W

----------


## PauseKawa

> @ PauseKawa : ca ne marche pas avec tes propositions


Oui, cela fonctionne. A condition de prendre en compte le fait que j'ai la touche f du clavier fatigue : curve(frame=self.rame, >>> curve(frame=self.frame,
Remplacez tous vos curve(frame, ... et curve(frame=f, ... par curve(frame=self.frame, ...

Note: Attention aussi au meli melo self.positie/frame.pos (self.frame.positie n'existe pas par exemple) et de pas oublier self (ligne 111 par exemple : self.positie = frame.pos >>> self.positie = self.frame.pos)

----------


## cecile vb

J'ai un peu chang mon code et maintenant l'erreur n'apparat plus, merci pour les ides!

Ma question de base est solutionne. 

Mais ce que je ne sais pas, c'est comment je dois lier mon code de formules  la visualisation, pour que mon vaisseau spatial bouge.

Dans ce cas, comment je dois lier la position de 'frame'  la vitesse, l'acclration ... 
Pour l'instant le vesseau ne bouge pas, alors qu'il devrait etre attir par la gravit. J'ai crit toutes les formules, mais j'ai du oubli une liaison quelque part ...

----------


## PauseKawa

Bonsoir,

En fait vous n'arrivez pas a utiliser les classes (et la poo. C'est le but de mon 'Note' au dessus.). Le code en deviens (ce n'est pas un reproche) n'importe quoi.


```

```



```

```

etc...



> mais j'ai du oubli une liaison quelque part


Oui... Apprendre les classes.

Dsol mais le code donn comporte trop de mconnaissances pour aller plus loin avec.

Note: Commencez par tester sans classe puisque ce n'est pas un sujet acquis.

@+

----------


## cecile vb

Ok, je comprends !
Pour les classes, je suis oblige de travailler avec ...

Merci pour votre temps consacr  mes questions.

Ccile

----------


## VinsS

Salut,

En simplifiant et en modifiant quelques paramtres j'arrive  piloter le module.



```

```

J'ai l'impression que tu as mlang les donnes positie, velocity, etc lors des mouvements gauche-droite, aussi ta constante DT (les constantes s'crivent en majuscules) tait trop petite pour un effet visible, je l'ai remplace par 2  certains endroits.

Il faudra encore refaire la fonction de dtection du crash, mais je ne sais pas comment tu comptais t'y prendre.

----------


## cecile vb

Un grand merci, VinsS d'avoir regard mon programme, et d'avoir fait boug le vaisseau!

J'ai quelques questions sur le code chang, je ne comprends pas tout

- ligne 49-50: je ne sais pas  quoi cela sert, et quand je fait 'crtl+c' IDLE affiche 'sys is not defined'

- ligne 85 et 89: pourquoi ajouter un tuple avec des valeurs fixes 

- ligne 93: 
la vitesse caus par l'attraction de la lune (qui est une acclration) est li au temps, la vitesse  laquelle le vesseau tombe doit augmenter au fur et  mesure que le jeu progresse 
la formule : v(t) = v + a*DT
ca donnerait : self.velocity = self.velocity + self.acceleration*DT
(et l'acceleration de -0.5 , sinon cela va trop lentement)

dans votre code , le temps n'a aucune influence sur la vitesse, mais dans le mien il le faut

- ligne 96: le *val  la place de *DT, je ne vois pas ce que cette valeur est, vous l'avez mis comme argument, mais o trouve-t-on une valeur pour val?


Pour la dtection de crash, j'ai recu du code qui dtecte quand 2 segments se touchent (dans l'attachement), mais je dois encore l'tudier

je pensais rassembler toutes les segments de la lune dans un 'tuple' ou dans une 'liste' et controler pour chaque segment si le vesseau ne le touche pas ( tout moment)
avec quelque chose comme : for i in (list) et puis le code.

Mais je n'ai pas encore eu le temps d'y travailler.

J'espre que mes questions et mes explications sont assez claires.

----------


## VinsS

Salut,

_sys_ est un module qu'il faut importer et que j'ai oubli dans mon code.

Pour les dplacements gauche droit, j'ai remplac tes valeurs par ces tuples parce que les valeurs que tu utilisais n'avais aucun effet. Modifies les valeurs, testes et tu comprendras ce que je veux dire.

Pour le reste, j'ai t un peu oblig de deviner le calcul auquel tu recourais pour la descente donc j'ai modifi tes donnes en me fiant uniquement au rsultat visible.

Avec tes nouvelles explications c'est plus clair. Et aussi plus simple.

J'ai modifi le code en utilisant ton calcul d'acclration et en supprimant des noms (variables) qui faisait doublon.

Par contre pour le calcul de la pousse, tu modifies l'altitude (coordonne Y) avec un valeur de 1 (sin(PI / 2)) ce qui n'a pratiquement aucun effet. Mais bon, a c'est  toi de juger comment le module doit ragir.



```

```

----------


## cecile vb

En fait, quand je tourne  gauche/droite, le module doit seulement changer son angle de  pi/20  /  -pi/20   chaque fois qu'on pousse sur la fleche, et garder ce nouvel angle. 
C'est pour cela que dans ma def draai_links / draai_rechts je n'ai mis que le changement de l'angle.

Mais je ne sais pas comment je dois lier cela au module. J'ai pens que a marcherait peut-tre avec l'axe, mais je ne sais pas comment.
Pour l'axe , j'ai trouv comment faire quand le frame est compos d'objects telle des cilindres, des cercles etc , mais pas pour un ensemble de segments.

Ce n'est que quand on pousse sur la flche du haut qu'il doit avancer le long de cet axe. Et quand on ne touche plus sur les fleches il doit tomber tout droit vers le sol. 

J'ai essay de commencer par la base, pour le jeu. Je voulais faire les 'dtails' plus tard.

J'ai encore du travail ...

----------


## VinsS

Ah ben oui, j'ai li directement le mouvement aux flches gauche-droite, je pensais que le bouton 'up' servait  redonner un peu d'altitude au vaisseau.

Mais a n'implique pas un gros changement a, et pour l'axe du vaisseau je pense que tu ne dois changer que l'axe du frame sans t'occuper de ses composants.

Regarde si ceci correspond:


```

```

J'ai rduit la vitesse (ligne 36) pour mieux visualiser les mouvements.


Tu as un collgue de cours qui a expos ce problme sur la ML de Python (1), son code est similaire au tien mais il multiplie par 10 la valeur d'angle de dviation.

(1) http://mail.python.org/pipermail/pyt...ry/637910.html

----------


## cecile vb

Dans votre version la flche du haut ne fonctionne pas, et quand j'utilise la flche de droite ou de gauche le module ne pas pas vraiment  droite ou gauche , mais on dirait qu'il tourne pour se mettre en profil.

J'ai vu que vous faites changer l'axe par (0,0,0.5), je pense que c'est a qui cause le mouvement de profil.
Et je pense que pour les vecteurs ,  c'est (cos(angle), sin(angle)) et non (sin, cos).

J'ai essay quelque chose , mais il quand on actionne les flches droite/gauche, il se rduit , devient plat, et rapparat  l'envers. Je ne sais pas ce qui cause ca. Et quand je pousse sur la flche du haut, il ne s'arrte plus !!



```

```

----------


## VinsS

> Dans votre version la flche du haut ne fonctionne pas, et quand j'utilise la flche de droite ou de gauche le module ne pas pas vraiment  droite ou gauche , mais on dirait qu'il tourne pour se mettre en profil.


Ben si, la flche _up_ provoque bien un dplacement du vaisseau quand je le teste chez moi. Tu as test mon code tel quel, sans rien changer ? jur ?




> J'ai vu que vous faites changer l'axe par (0,0,0.5), je pense que c'est a qui cause le mouvement de profil.


Ca c'est purement visuel, le vaisseau "semble" se tourner vers le ct, a ne change rien au fonctionnement, tu peux le virer si tu veux.




> Et je pense que pour les vecteurs ,  c'est (cos(angle), sin(angle)) et non (sin, cos).


Non.



```

```

Dans ce vecteur (sin(self.hoek), cos(self.hoek)) le premier lment modifiera la valeur X, soit le dplacement horizontal du vaisseau, donc, dans le cas du dplacement droit, + 1 et dans le cas du dplacement gauche - 1.

Si tu utilisais un dplacement de 6.1230317691118863e-17 tu ne verrais jamais ton vaisseau bouger, cette valeur est infiniment trop petite. On est d'accord ?




> J'ai essay quelque chose , mais il quand on actionne les flches droite/gauche, il se rduit , devient plat, et rapparat  l'envers. Je ne sais pas ce qui cause ca. Et quand je pousse sur la flche du haut, il ne s'arrte plus !!


Dans mon code, il n'est utile d'actionner les flches horizontales qu'une seule fois, C'est vrai que si on insiste, le vaisseau finit en Picasso, mais, comme j'ai dit, la rotation du vaisseau est purement cosmtique et non indispensable.

----------

