龟图形不是从功能中绘制的

时间:2012-12-05 18:27:20

标签: python function python-3.x turtle-graphics

使用下面的函数,并输入在空间上分割(即向前20),龟将执行颜色和写功能但使用前进,后退,右或左不做任何事情,只需打开一个空白的龟窗

这是我的函数和前向和后退命令代码的精简版本:

import sys
import turtle

def parse_line(line):
    global items_in_line
    items_in_line = line.split(" ",1)
    if items_in_line[0] == "forward":
        if isinstance(items_in_line[1], int):
                return items_in_line
    elif items_in_line[0] == ("back" or "backward"):
        if isinstance(items_in_line[1], int):
            return items_in_line
    return items_in_line



def comm(items_in_line):
    m = items_in_line[1]
    if items_in_line[0] == "forward":
        if isinstance(m,int) == True:
            turtle.forward(m)
    if items_in_line[0] == ("backward" or"back"):
        if isinstance(m,int) == True:
            turtle.back(m)

line=input("Enter a turtle command or enter 'file' to load commands from a file")

x = parse_line(line)

y=comm(items_in_line)

2 个答案:

答案 0 :(得分:0)

列表中的元素永远不会是int;如果你希望它们是int,那么你需要将它们传递给int()构造函数,捕获发生的任何异常。

>>> '3'
'3'
>>> int('3')
3

答案 1 :(得分:0)

这里有两个问题:

elif items_in_line[0] == ("back" or "backward"):

这意味着"backward"永远不会奏效。尝试在交互式窗口中输入:

>>> ("back" or "backward")
'back'

因此,检查某些内容是否等于("back" or "backward")与检查它是否等于"back"相同。

你想要这个:

elif items_in_line[0] in ("back", "backward"):

或者,如果你坚持,这个:

elif items_in_line[0] == "back" or items_in_line[0] == "backward":

然后,还有另一个问题:

if isinstance(m,int) == True:
    turtle.forward(m)

由于items_in_linesplit调用的结果,因此每个元素必须是一个字符串,因此它不可能是int。 (此外,除非您特别想要将== True与其他真值区分开来,否则不应在Python中执行True。)

你可能想要的是这样的:

try:
    amount_to_move = int(m)
except ValueError as e:
    print(<some message about the error>)
else:
    turtle.forward(amount_to_move)

您的代码的结构方式,在函数的两个分支中执行相同的检查,向上移动它可能更好,所以:

def comm(items_in_line):
    try:
        m = int(items_in_line[1])
    except ValueError:
        print(<some message>)
        return
    if items_in_line[0] == "forward":
        turtle.forward(m)
    if items_in_line[0] in ("backward", "back"):
        turtle.back(m)

或许你甚至不需要这里的try / except,因为你可以在更高级别处理它 - 毕竟,如果items_in_line只有1个元素,那么要提出一个你没有抓住的IndexError,那么为什么不像对待"forward foo"那样对待"forward"并让它涓涓细流到来电者那里?

def comm(items_in_line):
    m = int(items_in_line[1])
    if items_in_line[0] == "forward":
        turtle.forward(m)
    if items_in_line[0] in("backward", "back"):
        turtle.back(m)