【问题标题】:Turtle graphics not drawing from function海龟图形不是从函数中绘制的
【发布时间】:2012-11-23 16:11:16
【问题描述】:

使用下面的函数,输入在空间上分割(即向前 20),turtle 将执行颜色和写入函数,但使用 forward、back、right 或 left 什么都不做,只会打开一个空白的海龟窗口

这是我的函数和代码的精简版本,用于前进和后退命令:

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)

【问题讨论】:

  • 只是好奇-但是为什么您没有实施上一个问题的建议-因为您的“后退”位仍然不正确
  • 我有,在它们不在 parse_line 的 def 中的括号中之前,这是导致错误的原因
  • Err - 这仍然不正确 - 在您接受的答案的底部是 items_in_line[0] in ("back", "backward"): 这是应该写的方式;)
  • 啊,是的,出于某种原因,我认为它们可以互换。
  • @user1879595: ("backward" or "back") 首先被评估(你明确要求 Python 这样做,把它放在括号中),结果是 "backward"。所以你的比较和if items_in_line[0] == "backward"一样。

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


【解决方案1】:

这里有两个问题:

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。 (另外,你不应该在 Python 中使用 == True,除非你特别想将 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个元素,它会引发@987654339 @ 你没有捕捉到,那么为什么不像对待 "forward" 一样对待 "forward foo" 并让它滴到调用者身上呢?

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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这不是问题,即使没有 isinstance 子句,也不会发生任何事情。
    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2014-06-16
    • 2018-05-30
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多