代码之家  ›  专栏  ›  技术社区  ›  orcundinler

Turtle Name在单独的函数中定义变量后出错

  •  1
  • orcundinler  · 技术社区  · 1 年前

    我想创建一个乌龟游戏。当我在游戏中点击乌龟形状时,它应该给我+1分,这样我就可以计算分数了。但当我执行命令并点击乌龟形状时,它会给我一个名称错误,即 NameError: name 'score_turtle' is not defined 即使它是在上级命令中定义的。请帮我修一下。

    import turtle
    import random
    
    screen = turtle.Screen()
    screen.bgcolor("light blue")
    FONT = ('Arial', 25, 'normal')
    skor = 0
    turtle_list = []
    
    
    #score turtle
    
    
    def score_turtle_setup():
        score_turtle = turtle.Turtle()
        score_turtle.hideturtle()
        score_turtle.penup()
        score_turtle.color("dark blue")
        top_screen = screen.window_height() / 2
        y = top_screen * 0.85
        score_turtle.setpos(-200,y)
        score_turtle.write(arg=f"SCORE: 0", move=False, align="center", font=FONT)
    
    def make_turtle(x, y):
        point = turtle.Turtle()
    
        def handle_click(x, y):
            global skor
            skor += 1
            score_turtle.write(arg=f"SCORE: {skor}", move=False, align="center", font=FONT)
    
        point.onclick(handle_click)
        point.shape("turtle")
        point.penup()
        point.color("green")
        point.shapesize(1.5)
        point.goto(x * 12, y*12)
        turtle_list.append(point)
    
    
    x_coordinats = [-20,-10,0,10,20]
    y_coordinats = [20,10,0,-10]
    
    
    def setup_turtles():
        for x in x_coordinats:
            for y in y_coordinats:
                make_turtle(x, y)
    
    def hide_turtles():
        for point in turtle_list:
            point.hideturtle()
    
    def show_turtles():
        random.choice(turtle_list).showturtle()
    
    turtle.tracer(0)
    
    score_turtle_setup()
    setup_turtles()
    hide_turtles()
    show_turtles()
    
    turtle.tracer(1)
    
    turtle.mainloop()
    

    我试着调用函数 score_turtle_setup 来自 handle_click 功能,但不起作用。

    1 回复  |  直到 1 年前
        1
  •  1
  •   ggorlen Hoàng Huy Khánh    1 年前

    默认情况下,变量的作用域为函数。这意味着当函数返回时,函数作用域中的所有变量都将被销毁。幸运的是,函数允许您返回值,因此您可以执行以下操作:

    def score_turtle_setup():
        score_turtle = turtle.Turtle()
        # ...
        return score_turtle
    
    # ...
    score_turtle = score_turtle_setup()
    

    现在 score_turtle 变量是在全局范围中分配的,在全局范围内可以从任何其他函数访问它。

    这可能不是一个很好的设计,但对于一个小程序来说,这很好。接下来,如果程序增长,可以考虑使用类和/或模块来封装这样的逻辑实体。

    总的来说,这种情况并不是海龟特有的,所以 How do I get a result (output) from a function? How can I use the result later? 是一个很好的规范资源。