Python - имя 'высота' не определено - PullRequest
0 голосов
/ 20 октября 2018

У меня есть задание по информатике, где мне нужно написать функцию main(), которая вызывает функцию drawChessboard(), чтобы нарисовать шахматную доску 8x8, где пользователь может определить ширину и высоту доски.Мы изучаем функции и модули, и нам нужно использовать более одного модуля с несколькими функциями.Вот первый модуль, который у меня есть:

from chessboard import *

def main():

    startX, startY = eval(input("Enter the starting coordinates (x, y): "))
    width = input("Enter the width: ")
    height = input("Enter the height: ")
    spaceX = eval(width) / 8
    spaceY = eval(height) / 8

    def variables():
        global startX, startY, width, height, spaceX, spaceY, xLocation, yLocation

    if width == "" and height == "":
        drawChessboard(startX, startY)
    elif height == "":
        drawChessboard(startX, startY, width=eval(width))
    elif width == "":
        drawChessboard(startX, startY, height=eval(height))
    else:
        drawChessboard(startX, startY, eval(width), eval(height))


main()

Вот второй модуль под названием: chessboard.py

import turtle

global startX, startY, width, height, spaceX, spaceY, xLocation, yLocation

def drawRectangle():  # Define draw rectangle function

    turtle.penup()
    turtle.goto(xLocation, yLocation)
    turtle.pendown()
    turtle.left(90)
    turtle.begin_fill()
    turtle.forward(spaceX)
    turtle.left(90)
    turtle.forward(spaceY)
    turtle.left(90)
    turtle.forward(spaceX)
    turtle.left(90)
    turtle.forward(spaceY)
    turtle.end_fill()


def drawAllRectangles(startX, startY):          # function that will draw all rectangles to make up chessboard

    yLocation = startY
    while yLocation <= (height - 2 * spaceY):   # draw rectangles on rows 1, 3, 5, 7
        global xLocation
        xLocation = startX
        while xLocation <= (width - 2 * spaceX):
            drawRectangle()
            xLocation += 2 * spaceX
        yLocation += 2 * spaceY

    turtle.penup()
    turtle.goto(startX + spaceX, startY + spaceY)
    turtle.pendown()
    yLocation = startY + spaceY
    while yLocation <= (height - spaceY):       # draw rectangles on rows 2, 4, 6, 8
        xLocation = startX + spaceX
        while xLocation <= (width - spaceX):
            drawRectangle()
            xLocation += 2 * spaceX
        yLocation += 2 * spaceY

def drawChessboard(startX, startY, width = 250, height = 250):

    import turtle

    turtle.showturtle()         # Draw outside border for chessboard
    turtle.speed(10)
    turtle.penup()
    turtle.goto(startX, startY)
    turtle.pendown()
    turtle.forward(width)
    turtle.left(90)
    turtle.forward(height)
    turtle.left(90)
    turtle.forward(width)
    turtle.left(90)
    turtle.forward(height)

    drawAllRectangles(startX, startY)

    turtle.done()

Когда я пытаюсь запустить первый модуль, он выдает ошибкуиз первого while оператора drawAllRectangles(), который говорит, что имя height не определено.Я не знаю, как это исправить.Я попытался сделать все переменные глобальными, но это все равно дает мне тот же результат.Я посмотрел ошибку на этом сайте, но мне не повезло.Есть ли что-то, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Когда я удаляю глобальные переменные, все переменные не определены для использования, и я получаю ошибки.Что я могу сделать для этого?

Я согласен с @anon (+1) в отношении обоих глобальных символов и eval() в вашем коде.Ниже моя переделка вашего кода без глобальных переменных - вы сможете разбить его на два отдельных файла по мере необходимости.Вам необходимо (пере) прочитать о том, что делает ключевое слово global и где оно используется.Я понимаю, eval() удобен при вводе кортежа, но вы должны найти другой способ.Я заменил вам другие eval() звонки на int():

import turtle

def drawRectangle(xLocation, yLocation, spaceX, spaceY):

    turtle.penup()
    turtle.goto(xLocation, yLocation)
    turtle.pendown()

    turtle.begin_fill()

    for _ in range(2):
        turtle.forward(spaceX)
        turtle.left(90)
        turtle.forward(spaceY)
        turtle.left(90)

    turtle.end_fill()

def drawAllRectangles(startX, startY, width, height):
    """ Draw all rectangles to make up chessboard """

    spaceX = width / 8
    spaceY = height / 8

    yLocation = startY

    while yLocation <= (height - 2 * spaceY):  # draw rectangles on rows 1, 3, 5, 7
        xLocation = startX
        while xLocation <= (width - 2 * spaceX):
            drawRectangle(xLocation, yLocation, spaceX, spaceY)
            xLocation += 2 * spaceX
        yLocation += 2 * spaceY

    turtle.penup()
    turtle.goto(startX + spaceX, startY + spaceY)
    turtle.pendown()

    yLocation = startY + spaceY

    while yLocation <= (height - spaceY):  # draw rectangles on rows 2, 4, 6, 8
        xLocation = startX + spaceX
        while xLocation <= (width - spaceX):
            drawRectangle(xLocation, yLocation, spaceX, spaceY)
            xLocation += 2 * spaceX
        yLocation += 2 * spaceY

def drawChessboard(startX, startY, width=250, height=250):

    """ Draw outside border for chessboard """

    turtle.penup()
    turtle.goto(startX, startY)
    turtle.pendown()

    for _ in range(2):
        turtle.forward(width)
        turtle.left(90)
        turtle.forward(height)
        turtle.left(90)

    drawAllRectangles(startX, startY, width, height)

def main():

    startX, startY = eval(input("Enter the starting coordinates (x, y): "))
    width = input("Enter the width: ")
    height = input("Enter the height: ")

    turtle.speed('fastest')

    if width == "" and height == "":
        drawChessboard(startX, startY)
    elif height == "":
        drawChessboard(startX, startY, width=int(width))
    elif width == "":
        drawChessboard(startX, startY, height=int(height))
    else:
        drawChessboard(startX, startY, int(width), int(height))

    turtle.done()

main()

Не нужно много кода и усилий, чтобы нарисовать шахматную доску с черепашкой Python.Я рекомендую вам изучить stamp(), чтобы ускорить и упростить это.

0 голосов
/ 20 октября 2018

Вы дважды использовали высоту в этой функции

def drawAllRectangles(startX, startY):          # function that will draw all rectangles to make up chessboard

    yLocation = startY
    while yLocation <= (height - 2 * spaceY):   # draw rectangles on rows 1, 3, 5, 7
        global xLocation
        xLocation = startX
        while xLocation <= (width - 2 * spaceX):
            drawRectangle()
            xLocation += 2 * spaceX
        yLocation += 2 * spaceY

    turtle.penup()
    turtle.goto(startX + spaceX, startY + spaceY)
    turtle.pendown()
    yLocation = startY + spaceY
    while yLocation <= (height - spaceY):       # draw rectangles on rows 2, 4, 6, 8
        xLocation = startX + spaceX
        while xLocation <= (width - spaceX):
            drawRectangle()
            xLocation += 2 * spaceX
        yLocation += 2 * spaceY

эта переменная не существует в этой функции.не используйте глобальный.Вы использовали высоту в

def drawChessboard(startX, startY, width = 250, height = 250):

, поэтому вам нужно сделать то же самое здесь

def drawAllRectangles(startX, startY, width, height): 

, поэтому при вызове drawAllRectangles убедитесь, что вы передаете эти 4 переменные.

Кроме того, переместите все ваши импортные файлы в начало файлов.и посмотрите, что делает eval (https://www.programiz.com/python-programming/methods/built-in/eval). Вам не нужны глобальные переменные или eval нигде в вашей программе.

...