kalme
kalme

Reputation: 1

Using screen.onclick() in Turtle with a function that returns multiple values

I am trying to use the coordinates from a user's mouse click as the x and y for another function. When that second function runs, it returns two values (not x and y).

But when I run the onclick method, I get "TypeError: cannot unpack non-iterable NoneType object" before I even click anything.

def on_click(x, y):
        t = turtle.Turtle()
        screen = turtle.Screen()
        t.penup()
        t.goto(x, y)

        #do stuff part 1
        #do stuff part 2

        return value1, value2

def main():
        t = turtle.Turtle()
        screen = turtle.Screen()
        value1, value2 = screen.onclick(on_click)

        #do other stuff with value1 and value2

main()

Am I using the turtle onclick function incorrectly? Or perhaps setting up my turtle screen wrong?

Else, if I can't return multiple values while using onclick, what would be a work around for getting those two values back into my main function?

Any help would be appreciated!

Upvotes: 0

Views: 2639

Answers (1)

cdlane
cdlane

Reputation: 41905

This syntax indicates you are nor thinking about event handlers correctly:

value1, value2 = screen.onclick(on_click)

The screen.onclick() function doesn't return anything (i.e. None) and your on_click() function can't return anything (i.e. None). You are not calling on_click() at this point in the code, it will be called in the future if/when a click occurs, so returning values doesn't apply. (The caller can't use them.)

You've got some choices: you can put (value1, value2) into a global for some other code to access; you can pass it to another function call. But you can't return it. Structurally, your code might look like:

from turtle import Screen, Turtle

def on_click(x, y):
    screen.onclick(None)  # disable handler inside handler

    turtle.goto(x, y)

    # do stuff part 1
    # do stuff part 2

    some_other_function(value1, value2)

    screen.onclick(on_click)  # reenable handler

def some_other_function(v1, v2):
    #  do other stuff with value1 and value2
    pass

screen = Screen()

turtle = Turtle()
turtle.penup()

screen.onclick(on_click)

screen.mainloop()

Upvotes: 1

Related Questions