2015-02-06 6 views
-4

Write a program that asks the user for a color, a line width, a line length and a shape. The shape should be either a line, a triangle, or a square. Use turtle graphics to draw the shape that the user requests of the size, color, line width and line length that the user requests. For example, if these are the user choices for color, width, line length and shapePython: Напишите программу, которая запрашивает у пользователя цвет, ширину линии, длину линии и форму

какой цвет? синий
какой линия ширина? 25
какой длина строки? 100
линия, треугольник или квадрат? треугольник

Это моя попытка:

color = input('Enter your preferred turtle line color: ') 
width = input('Enter your preferred turtle line width: ') 
length = input('Enter your preferred turtle line length: ') 
shape = input('Specify whether you want to draw a line, triangle, or square: ') 

import turtle 
s = turtle.Screen() 
t = turtle.Turtle() 
t.pencolor(color) 
t.pensize(width) 
if shape == 'line': 
    t.forward(length) 

elif shape == 'triangle': 
    t.forward(length) 
    t.right(45) 
    t.forward(length) 
    t.right(90) 
    t.forward(length) 

else: 
    t.forwad(length) 
    t.right(90) 
    t.forwad(length) 
    t.right(90) 
    t.forwad(length) 
    t.right(90) 
    t.forwad(length) 

Я получаю эту ошибку:

Traceback (most recent call last): 
    File "<pyshell#42>", line 4, in <module> 
    t.forward(length) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/turtle.py", line 1637, in forward 
    self._go(distance) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/turtle.py", line 1604, in _go 
    ende = self._position + self._orient * distance 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/turtle.py", line 257, in __mul__ 
    return Vec2D(self[0]*other, self[1]*other) 
TypeError: can't multiply sequence by non-int of type 'float' 

Может кто-то пожалуйста, объясните, почему длина в передних команд не будет идти до конца?

+1

Попробуйте отформатировать ваш вопрос, так что это более читаемым – taesu

+0

http://stackoverflow.com/help/formatting – user3467349

+0

Я думаю, что вы RINPUT переменные, .e.g. длина - все строки. заставить их плавать или интигеры. – Marcin

ответ

1

Первая проблема, которую я вижу, что вы оставили «г» из вперед.

t.forwad(length) 

должен быть

t.forward(length) 

Кроме того, если вы используете input()width и length будут строки, но они должны быть типаж. Specifically, длина должна быть целым числом или плавающей точкой, а ширина должна быть положительным целым числом.

length = None 
while not length: 
    try: 
     length = float(input('Enter your preferred turtle line length: ')) 
    except ValueError: 
     print('You need to enter a number') 

width = None 
while not width: 
    try: 
     width = int(input('Enter your preferred turtle line width: ')) 
    except ValueError: 
     print('You need to enter a positive integer') 
    else: 
     if width < 1: 
      print('You need to enter a positive integer') 
      width = None 

Код, который у меня здесь, будет использовать цикл для получения правильного ввода от пользователя. Он попытается отвергнуть плохие входы. Например, если пользователь вводит «тыкву», когда вы запрашиваете длину.

Точно так же, как я ломаю проблемы с записями длины и ширины, вы захотите поймать проблемы с вводом пользователя для формы и цвета. Убедитесь, что пользователь вводит допустимый цвет. Убедитесь, что фигура находится в списке допустимых фигур.

Последняя проблема заключается в том, что ваш код здесь не имеет отступов должным образом. Вы должны сделать отступ после предложений if: и else:.

Вот вся программа рабочая:

import turtle 

s = turtle.Screen() 
t = turtle.Turtle() 

length = None 
while not length: 
    try: 
     length = float(input('Enter your preferred turtle line length: ')) 
    except ValueError: 
     print('You need to enter a number') 

width = None 
while not width: 
    try: 
     width = int(input('Enter your preferred turtle line width: ')) 
    except ValueError: 
     print('You need to enter a positive integer') 
    else: 
     if width < 1: 
      print('You need to enter a positive integer') 
      width = None 
color = None 
while not color: 
    color = input('Enter your preferred turtle line color: ') 
    try: 
     t.pencolor(color) 
    except: 
     print('You need to enter a color that I know.') 
     color = None 
shape = None 
while not shape: 
    shape = input('Specify whether you want to draw a line, triangle, or square: ') 
    if shape.lower() not in ['line', 'triangle', 'square']: 
     shape = None 
     print('I only draw lines, triangles and squares!') 


t.pensize(width) 
if shape.lower() == 'line': 
    t.forward(length) 
elif shape.lower() == 'triangle': 
    t.forward(length) 
    t.right(120) 
    t.forward(length) 
    t.right(120) 
    t.forward(length) 
else: 
    t.forward(length) 
    t.right(90) 
    t.forward(length) 
    t.right(90) 
    t.forward(length) 
    t.right(90) 
    t.forward(length) 

s.exitonclick() 

Обратите внимание, что я также установил треугольники ...

+1

'length' должен быть int или float. 'width' должно быть« положительным числом ». https://docs.python.org/3/library/turtle.html#turtle.forward –

+0

@ HåkenLid Интересно, потому что трассировка, кажется, показывает, что он использовал 'float', и это порождает ошибку. –

+0

Я думаю, что проблема - это последовательность, а не поплавок. 'str * float' не работает. –

-1

ваш еще условно имеет грамматическую ошибку: t.forwad(length) вместо t.forward(length)

+0

Зачем вам это делать? – nitimalh

+0

Это была проблема, спасибо, но я все еще имею ошибку, не могу умножить последовательность на non-int типа 'float' – Timothy

-1

Вы используете Python 3.x и input() там возвращает строку, а не с плавающей точкой , Вы должны привести результат, прежде чем использовать его как номер:

length = float(input('Enter your preferred line length: ')) 

Проблема заключается в том, что где-то внутри turtle класса, length умножается на число с плавающей точкой. Если бы length сам был бы номером, все было бы в порядке. Но в вашем случае length - это строка, поэтому Python должен выполнить string * float. Теперь string рассматривается как последовательность символов. В Python допустимо умножить последовательность на целое ('ab'*3 = 'ababab'), но не на другие типы (в частности, на float).Вот почему вы получаете это сообщение об ошибке при умножении последовательности на не-тип.

+0

Я думаю, что вы неправильно понимаете ошибку. '__mul__' жалуется, что делает' [some, sequence] * some_float'. Что '[0, 1, 2] * 1.5'? :) –

+0

'' 1.5 "* 1.5' также вызывает ту же ошибку:' TypeError: не может умножить последовательность на non-int типа 'float'' –

+0

Вправо. Точнее, он жалуется на 'self [0] * other', где' self [0] 'is' turtle._orient [0] ', а' other' - 'length'. Я предполагаю, что одна из них является строкой (которая представляет собой последовательность символов), и очень вероятно, что виновником является «длина» :) – Inspired

-1
import turtle 

s = turtle.Screen() 
t = turtle.Turtle() 

length = None 
while not length: 
    try: 
     length = float(input('Enter your preferred turtle line length: ')) 
    except ValueError: 
     print('You need to enter a number') 

width = None 
while not width: 
    try: 
     width = int(input('Enter your preferred turtle line width: ')) 
    except ValueError: 
     print('You need to enter a positive integer') 
    else: 
     if width < 1: 
      print('You need to enter a positive integer') 
      width = None 
color = None 
while not color: 
    color = input('Enter your preferred turtle line color: ') 
    try: 
     t.pencolor(color) 
    except: 
     print('You need to enter a color that I know.') 
     color = None 
shape = None 
while not shape: 
    shape = input('Specify whether you want to draw a line, triangle, or square: ') 
    if shape.lower() not in ['line', 'triangle', 'square']: 
     shape = None 
     print('I only draw lines, triangles and squares!')strong text 
+2

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – DimaSan

0

Смешение командной строки ввода с черепахой графикой кажется плохой идеей, если значения, которые вы хотите могут быть получены с использованием графических методов ввода, что модуль черепаха обеспечивает:

  • textinput(title, prompt)

  • numinput(title, prompt, default=None, minval=None, maxval=None)

Данные a re, предназначенный для предотвращения некоторых ошибок, которые код командной строки должен ловить. Вот ваша программа переписана с графическими методами ввода:

from turtle import Turtle, Screen, TurtleGraphicsError 

screen = Screen() 

length = None 
while not length: 
    length = screen.numinput('Select Length', 'Enter your desired line length:', minval=1) 

width = None 
while not width: 
    width = screen.numinput('Select Width', 'Enter your desired line width:', minval=1, default=1) 

turtle = Turtle() 
turtle.pensize(width) 

color = None 
while not color: 
    try: 
     color = screen.textinput('Select Color', 'Enter your desired line color:') 
     turtle.pencolor(color) 
    except TurtleGraphicsError: 
     color = None 

shape = None 
while not shape or shape.lower() not in {'line', 'triangle', 'square'}: 
    shape = screen.textinput('Select Shape', 'Specify whether you want a line, triangle, or square:') 
shape = shape.lower() 

if shape == 'line': 
    turtle.forward(length) 
elif shape == 'triangle': 
    for _ in range(3): 
     turtle.forward(length) 
     turtle.right(120) 
else: 
    for _ in range(4): 
     turtle.forward(length) 
     turtle.right(90) 

screen.exitonclick() 
Смежные вопросы

 Смежные вопросы