簡體   English   中英

烏龜圖形未從功能中繪制

[英]Turtle graphics not drawing from function

使用下面的功能,以及在空間上分割的輸入(即正向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)

您列表中的元素永遠不會是int 如果希望它們為int則需要將它們傳遞給int()構造函數,以捕獲發生的任何異常。

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

這里有兩個問題:

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與其他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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM