The screen.onkey()
function expects a function as input. In your first example you do this correctly (screen.onkey(checka, 'a')
), but in the second example, you call the function before you pass it (screen.onkey(check('a'), 'a')
. This means that you are passing the return value of the check
function, not the function itself.
Your check function doesn't have any return
statements in that return a value explicitly. In Python, functions that don't return a value explicitly return None
. So you are in effect calling screen.onkey(None, 'a')
, which I am guessing does not have any effect.
To fix this, you can use a closure - a function inside a function. With closures, the inner function can use variables available to the outer function, which means you can make check functions for any letter.
def make_check_func(l):
def check():
write(l)
fd(10)
return check
screen.onkey(make_check_func('a'), 'a')
screen.onkey(make_check_func('b'), 'b')
Or, as quamrana suggests, you can do the same thing with less code by using lambda functions.
def check(l):
write(l)
fd(10)
screen.onkey(lambda: check('a'), 'a')
screen.onkey(lambda: check('b'), 'b')
--EDIT--
To add functions for all of the letters in the alphabet, you can use a for loop. Conveniently, Python has already defined a string containing all the lowercase ASCII characters at string.ascii_lowercase, so we can use that to loop over.
import string
def make_check_func(l):
def check():
write(l)
fd(10)
return check
for l in string.ascii_lowercase:
screen.onkey(make_check_func(l), l)
Here, the body of the for loop will be run once for each character in the string, and the value of l
will be that character. This has the effect of running screen.onkey(make_check_func('a'), 'a')
, then screen.onkey(make_check_func('b'), 'b')
, all the way through to screen.onkey(make_check_func('z'), 'z')
.
Note that using screen.onkey(lambda: check(l), l)
inside the for loop will not work, as the value of l
that the lambda function "remembers" will be always be "z". See the common gotchas entry for an explanation.