Python中如何在onkeypress按键触发时调用需要传参的函数
你可以通过以下三种常用方式实现需求,同时要注意你现有代码存在的变量作用域问题,否则即使成功传参也无法看到curr_draw_col数值变化:
问题前置修复
Python中整数是不可变类型,你当前在函数内对参数curr_draw_col执行+=1,只会修改函数内部的局部变量,不会影响外部的同名变量,需要先修正这个逻辑。
方案1:使用全局变量(对新手最友好,无需传参)
直接把curr_draw_col声明为全局变量,函数内修改时用global关键字标注即可,不需要给函数传参:
# 全局定义curr_draw_col curr_draw_col = 0 def scroll_draw_col(): # 声明使用全局变量 global curr_draw_col curr_draw_col += 1 WIN.listen() WIN.onkeypress(tri_fwd, 'Up') WIN.onkeypress(tri_bkw, 'Down') WIN.onkeypress(tri_left, 'Left') WIN.onkeypress(tri_right, 'Right') # 直接绑定函数名即可 WIN.onkeypress(scroll_draw_col, 'f') while True: WIN.update() dra.goto(tri.xcor(), tri.ycor()) print(curr_draw_col)
方案2:用lambda匿名函数封装传参
如果你不想用全局变量,需要保留函数的入参设计,可以用lambda匿名函数把参数和调用逻辑封装在一起,绑定给onkeypress:
# 用可变对象(列表)存储curr_draw_col,避免全局变量的同时实现内部修改外部生效 curr_draw_col = [0] def scroll_draw_col(col_obj): col_obj[0] += 1 WIN.listen() # lambda会在按键触发时执行内部的调用逻辑,完成传参 WIN.onkeypress(lambda: scroll_draw_col(curr_draw_col), 'f') while True: WIN.update() dra.goto(tri.xcor(), tri.ycor()) # 读取列表第0位就是最新值 print(curr_draw_col[0])
方案3:用functools.partial实现参数绑定
你也可以用Python标准库的partial工具提前把参数绑定到函数上,生成一个不需要传参的新函数再绑定给按键:
from functools import partial curr_draw_col = [0] def scroll_draw_col(col_obj): col_obj[0] += 1 WIN.listen() # 提前把curr_draw_col绑定为scroll_draw_col的入参,生成新函数 WIN.onkeypress(partial(scroll_draw_col, curr_draw_col), 'f')
内容的提问来源于stack exchange,提问作者AKENY
相关产品推荐
相关产品推荐

