创建函数时触发TypeError:klik()缺少必需位置参数'j',求修复方法
解决TypeError: klik() missing 1 required positional argument: 'j'的问题
我来帮你拆解这个错误的根源,以及快速修复的方法:
错误原因
当你用Tkinter的canvas.bind('<ButtonPress-1>', klik)绑定点击事件时,Tkinter会自动把事件对象作为第一个参数传递给绑定的函数。但你的klik(h,j)函数定义要求传入两个参数,这就导致了参数不匹配——实际只传了1个事件参数,函数却需要2个,所以抛出了这个TypeError。
另外看你的代码逻辑,函数内部已经通过for h in range(0,100)和for j in range(0,100)重新定义了这两个变量,说明你本来就不需要从外部传入h和j,这两个参数完全是多余的。
修复步骤
- 调整
klik函数的参数,只保留Tkinter自动传递的事件参数(可以用event作为参数名;如果不需要使用事件的具体属性,也可以用下划线_占位,表示这个参数只是用来接收但不用)。 - 移除函数定义里多余的
h,j参数。
修改后的代码
def klik(event): # 只保留事件参数 global w,z for h in range(0,100): for j in range(0,100): if m[h][j]==0.0: f='white' else: f='black' canvas.create_rectangle(w,z,w+strana,z+strana, fill=f, outline="" ) w+=strana z+=strana w=0 canvas.bind('<ButtonPress-1>', klik)
如果不需要使用事件对象的任何信息,也可以这样写(用下划线占位更直观):
def klik(_): # 下划线表示这个参数不需要使用 global w,z for h in range(0,100): for j in range(0,100): if m[h][j]==0.0: f='white' else: f='black' canvas.create_rectangle(w,z,w+strana,z+strana, fill=f, outline="" ) w+=strana z+=strana w=0 canvas.bind('<ButtonPress-1>', klik)
额外优化提示
顺便提一句,你当前的循环逻辑可能会让矩形绘制位置不符合预期——每次内层循环j增加时,w和z同时累加,会导致矩形斜着排列。如果你的目标是绘制100x100的网格,应该在每一行结束后重置w,而不是只在最后重置:
def klik(event): global w,z for h in range(0,100): w = 0 # 每一行开始时重置横向位置 for j in range(0,100): if m[h][j]==0.0: f='white' else: f='black' canvas.create_rectangle(w,z,w+strana,z+strana, fill=f, outline="" ) w+=strana z+=strana # 每一行结束后纵向位置下移 z=0 # 所有行绘制完成后重置纵向位置
这样才能正确画出每行100个、共100行的规整网格。
内容的提问来源于stack exchange,提问作者user11574067
相关产品推荐
相关产品推荐

