You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:45:10