2017-10-03 6 views
0

Depuis que je suis fait avec ce qui en fait le code de la moyenne et la distance:Essayer de mettre IntergerMath sur Python Graphics tortue

x1=eval(input("Please insert a first number: ")) 
y1=eval(input("Please insert a second number: ")) 
x2=eval(input("Please insert a third number: ")) 
y2=eval(input("Please insert a fourth number: ")) 
add = x1 
add = add + y1 
add = add + x2 
add = add + y2 
average = add/4 
d= distanceFormula(x1,y1,x2,y2) 
print("Average:", average) 
print("Distance:", d) 

Je suis maintenant travaille actuellement sur l'ajout de graphiques pour se connecter intergermath sur un graphique à barres avec graphiques de tortue de python. Cependant, je suis tombé sur quelques problèmes quand je tape ce code (entrée):

def doBar(height, clr): 
    begin_fill() 
    color(clr) 
    setheading(90) 
    forward(height) 
    right(90) 
    forward(40) 
    right(90) 
    end_fill() 

y_values = [str(y1), str(y2)] 
x_values = [str(x1), str(x2)] 
colors= ["red", "green", "blue", "yellow"] 
up() 
goto(-300, -200) 
down() 
idx = 0 
for value in y_values: 
    doBar(value, colors[idx]) 
    idx += 1 

Et voici le résultat sur la sortie que je suis arrivé quelques erreurs après il est sorti comme d'habitude:

Traceback (most recent call last): 
in main 
doBar(value, colors[idx]) 
in doBar 
forward(height) 
line 1637, in forward 
self._go(distance) 
line 1604, in _go 
ende = self._position + self._orient * distance 
line 257, in __mul__ 
return Vec2D(self[0]*other, self[1]*other) 
TypeError: can't multiply sequence by non-int of type 'float' 

Donc, j'essaie de faire ici est d'utiliser à la fois la moyenne et la distance comme une entrée et la sortie devrait demander à un utilisateur d'insérer quatre chiffres et il va dessiner quatre barres sur un graphique de tortue python. Alors comment puis-je faire en sorte que ce code fonctionne sur les graphiques?

+0

S'il vous plaît ne jamais utiliser 'eval (entrée())'. C'est dangereux. –

+0

Quelle est la dangerosité d'eval (input())? –

+0

[Very!] (Https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) Un code malveillant arbitraire sera exécuté, par exemple de la manière illustrée ici: https://stackoverflow.com/a/37081082/5067311 –

Répondre

0

height passe en doBar() sous la forme chaîne. La fonction passe ensuite la chaîne à la fonction forward(), cependant, qui nécessite un entier ou un flottant.

Les valeurs y sont converties en chaînes ici:

y_values = [str(y1), str(y2)] 

Vous pouvez le réparer en enlevant la str() conversion:

y_values = [y1, y2] 

doBar() dessine un triangle, pas un rectangle. Il a besoin d'une ligne verticale plus de longueur height à tirer pour le côté droit du rectangle:

def doBar(height, clr): 
    begin_fill() 
    color(clr) 
    setheading(90) 
    forward(height) 
    right(90) 
    forward(40) 
    right(90) 
    forward(height) # draw back down to the x-axis 
    end_fill() 
+0

Bon nouveau problème: Malgré le fait que vous m'avez aidé à résoudre votre problème, j'ai obtenu un résultat qui ne dessinait que deux triangles mais pas de barres comme je le pensais au départ. –

+0

Voici le résultat: https://i.stack.imgur.com/Djzvv.png –

+0

@ AntonO.Obyedkov: regardez votre fonction 'doBar()'. Il dessine une ligne «hauteur», puis trace une ligne de longueur 40 vers la droite, puis s'arrête et se remplit. Il n'y a que 2 lignes donc ça fait un triangle. Vous devez ajouter un autre appel à 'forward (height)' avant de remplir pour dessiner le côté droit de la barre. – mhawke