Python Tkinter鼠标左键绑定失效,报TypeError错误求助
解决Tkinter绑定鼠标左键时的TypeError问题
嘿,我来帮你搞定这个报错!你遇到的TypeError: delete() takes 0 positional arguments but 1 was given问题,根源其实很简单——Tkinter的事件绑定函数会自动传递一个事件对象参数,但你的delete()函数没准备接收它。
问题原因
当你用canvas.bind('<Button-1>', delete)把鼠标左键点击事件绑定到delete函数时,每次点击左键,Tkinter都会把一个包含点击细节(比如点击坐标)的事件对象作为参数传给delete,但你定义的delete()没有任何参数,自然就会触发类型错误啦。
修复步骤
- 给
delete函数添加一个参数(比如event),哪怕你用不到这个参数也得加上:def delete(event): canvas.delete("all") global a # 别忘了声明a是全局变量 a=0 setric() - 另外,你的代码里
a变量在setric里用了global,但一开始没初始化,运行时可能会触发NameError,所以要在全局作用域里先给a赋值:a = 0 # 全局初始化变量a - 最后别忘了加上
tkinter.mainloop(),不然你的屏保程序运行后会立刻退出,看不到效果。
完整修复后的代码
import tkinter from random import * canvas=tkinter.Canvas(width=1000,height=800) canvas.pack() entry1=tkinter.Entry() entry1.pack() a = 0 # 全局初始化变量a def setric(): global a x=randrange(900) y=randrange(700) canvas.delete('all') farba=choice(("red","purple","blue","lightblue","green","lightgreen")) if a>-90: a=a-10 else: a=-10 if entry1.get()=="": canvas.update() canvas.after(3000,setric) a=0 else: canvas.create_text(x,y,text=entry1.get(),font="Arial 40",fill=farba,angle=a) canvas.after(2000, setric) def delete(event): global a canvas.delete("all") a=0 setric() canvas.bind('<Button-1>',delete) tkinter.mainloop()
额外小提醒
Tkinter所有绑定事件的回调函数,都必须接受至少一个参数(事件对象),这是框架的固定规则哦~以后绑定键盘、鼠标这类事件时,都要记得给回调函数留一个参数位置。
内容的提问来源于stack exchange,提问作者Jozef Vitko
相关产品推荐
相关产品推荐

